sed 是非交互的,文本命令行编辑工具
#复制/etc/profile 到/tmp目录,用查找替换命令删除/tmp/profile文件中的行首的空白字符
cp -a /etc/profile /tmp;sed 's#^[[:space:]]*##' /tmp/profile
于是,整理下sed的命令
sed 文本命令行编辑工具
用法: sed [option]… ‘script’ inputfile…
常用选项:
-n 不输出模式空间内容到屏幕,即不自动打印,进行测试,防止修改文件,没有输出
-e 多点编辑,内嵌脚本, 命令行中给的sed执行脚本,可以给出多个命令行脚本,每个脚本都有
-f /PATH/SCRIPT_FILE 从指定文件中读取编辑脚本,读取指定文件是,有几个选项
-r 支持使用扩展正则表达式
-i 输出到原文件,静默执行(修改原文件的意思)
sed 编辑命令:
-d 删除模式空间匹配的行,并立即启用下一轮循环
-p 打印当前模式空间内容,追加到默认输出之后
-a [\]text 在指定行后面追加文本,支持使用\n实现多行追加
-i [\]text 在行前面插入文本
-c [\]text 替换行为单行或多行文本
-w /path/file 保存模式匹配的行至指定文件
-r /path/file 读取指定文件的文本至模式空间中匹配到的行后
= 为模式空间中的行打印行号
! 模式空间中匹配行取反处理
```bash
```bash
**sed 具体**
sed 使用的默认分隔符 /
**s/// 查找替换,支持使用其它分隔符,s@@@,s###**
替换标记:
g 行内全局替换
p 显示替换成功的行
w /PATH/FILE 将替换成功的行保存至文件中
sed示例
1,sed ‘2p’ /etc/passwd
2,sed -n ‘2p’ /etc/passwd #显示第二行的账号信息
3,sed -n ‘1,4p’ /etc/passwd #显示第一到第四行的信息
4, sed -n ‘/root/p’ /etc/passwd #显示有root 的信息
5,sed -n ‘2,/root/p’ /etc/passwd # 从2行开始,显示内容中有root的行数信息
6,sed -n ‘/^$/=’ file 显示空行行号
7,sed -n -e ‘/^$/p’ -e ‘/^$/=’ file #仅显示空白行的行号
8,Sed‘/root/a\superman’ /etc/passwd行后
9,sed ‘/root/i\superman’ /etc/passwd 行前
10,sed ‘/root/c\superman’ /etc/passwd 代替行
11,sed ‘/^$/d’ file #显示没有空白行的其他行数
11,sed ‘1,10d’ file #显示前10行
12,nl /etc/passwd | sed ‘2,5d’ #显示内容,排除2-5行内容
13,nl /etc/passwd | sed ‘2a tea’ # 在第二行下添加一行 内容为tea
14,sed 's/test/mytest/g' example #显示替换后的内容
15,sed –n ‘s/root/&superman/p’ /etc/passwd #显示 root后面添加字符的行数
16,sed –n ‘s/root/superman&/p’ /etc/passwd 单词前 显示root前面添加字符的行数
17,sed -e ‘s/dog/cat/’ -e ‘s/hi/lo/’ test.txt #一个文本文件中的多个字符替换
高级编辑命令
P: 打印模式空间开端至\n内容,并追加到默认输出之前
h: 把模式空间中的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间中
g: 从保持空间取出数据覆盖至模式空间
G:从保持空间取出内容追加至模式空间
x: 把模式空间中的内容与保持空间中的内容进行互换
n: 读取匹配到的行的下一行覆盖至模式空间
N:读取匹配到的行的下一行追加至模式空间
d: 删除模式空间中的行
D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本, 并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间 不包含换行符,则会像发出d命令那样启动正常的新循环
================================================================
sed 经常被使用于文本过滤,它接受文本输入,对文本进行一些操作或者一组操作,同时将修改后的文本输出sed通常使用于模式匹配,提取文件的一部分,或者替换文件内多次出现的字符串。
四 sed正则模式匹配
单个字符{如果没有特殊字符},进行匹配文本
匹配前一个字符的零个或多个重复序列分组或着类
+ 和*类似,但匹配一个或者更多
? 和*类似,仅匹配0次或者1次
{i} 和*类似,但是和i 完全匹配,匹配的字符介于 0-255个
{i,j} 介于 i和j 之间,包括i,j
{i,} 匹配多个或者匹配i
{,j} 最多匹配j或者等于j个
(RE)\ 组作为一个整体,用于:
应用后缀运算符,如 '(abcd)',这将搜索零个或者多个完整的
"abcd"序列,如果 'abcd*', 它将搜索"abc",后面跟0个或者多个d
使用反向引用
. 匹配任意字符
^ 匹配行首的空字符串,即^之后出现的内容必须出现在行首,
例如:
'^#include' 将只匹配第一行中的 “#include”的行,
但是,如果之前有一两个空格,那么匹配失败。
$ 和^类似,匹配行尾
\c 匹配字符 "C" 用于匹配特殊字符
[list] 匹配列表中的任意单个字符。 例如: [aeiou] 匹配所有原音
[^list] 匹配不再列表的任意字符。
列表可以由 - , 表示,和之间的
所有字符都要包含再列表中,使其成为列表中第一个包含`]' 的字符
'-' 使得其成为第一个或者最后一个字符
RE1|RE2 匹配RE1或者RE2
\1 \2 \3 \4 \5 \6 \7 \8 \9, => \i
匹配re的第i个引用,这称为反向引用,通常它非常慢
注意:
sed 某些实现可能没有提到所有的res,特别是 '+' '?'
'|'
-RE 是贪婪的,如果检测到两个或者更多匹配,它选择最长的,如果有
两个或者更多学则具有相同大小的,它选择文本中的第一个
例子:
'abcdef' 匹配"abcdef"
'a*b' 匹配0个或者多个 “a” ,后面跟一个"b"
比如: "b" 或者 “aaaaab”
'a?b' 匹配 "b"或者"ab"
'a+b+' 匹配1个或多个 "a",然后是一个或多个 "b",最小匹配将是
"ab",但是 "aaaab" 或"aaaaabbbbb"也依然匹配
'.*' 全匹配,文本所有行的字符,包括空字符
'.+' 全匹配,但仅包含至少一个字符的行,也就是说,空行不匹配。
'main(.)' 搜索 “main”的行作为改行的第一件事,该行还包含一个
左括号和右括号, () 是任意数量字符(包括空)前后的左括号。
'^#' 匹配 "#"号开始的行
'\$' 所有单个以 '' 结尾的行,有两个,用于转义。
'a-zA-Z_' 任意字母或者数字
'[^ ]+' (一个tab键和一个空格) 不是空格或 制表符的任何字符的一个或者多个
'^.A.$' 匹配中间有 "A" 的字符
'A.{9}$' 匹配正好是第十行的最后一个字符 “a”
'^.{,15}A' 匹配该行前16个字符的最后一个 "A"
例子
#获取centos的IP
[root@localhost ~]# ifconfig|sed -nr '2s/(^[^0-9]+)([0-9.]+)( .*$)/\2/p'
或者
[root@localhost ~]# ifconfig|sed -n ’2p‘|sed -r 's/(^[^0-9]+)([0-9.]+)( .*$)/\2/p'
192.168.233.150