说明
sed用于选取替换删除新增 sed [选项] [动作][文件]
选项:
-n:一般sed命令会把所有数据都输出到屏幕,如果加入此选择,则只会把经过sed命令处理的行输出到屏幕。
-e:允许对输入数据应用多条sed命令编辑。
-f 脚本文件名:从sed脚本中读入sed操作。和awk命令的-f非常类似。
-r:在sed中支持扩展正则表达式。
-i:用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出
动作:
a \:追加,在当前行后添加一行或多行。添加多行时,除最后一行外,每行末尾需要用“\”代表数据未完结。
c \:行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需用“\”代表数据未结。
i \:插入,在当期行前插入一行或多行。插入多行时,除最后一行外,每行末尾需要用“\”代表数据未完结。
d:删除,删除指定的行。
p:打印,输出指定的行。
s:字串替换,用一个字符串替换另外一个字符串。格式为“行范围s/ 旧字串/新字串/g”(和vim中的替换格式
类似)。
sed所做的修改并不会直接改变文件的内容(如果是用管道符接收的命令的输出,这种情况连文件都没有),
而是把修改结果只显示到屏幕上,除非使用“-i”选项才会直接修改文件。
查询
-n只输出合乎条件的
p显示第二行
sed -n '2p' test.txt
输出:22 bb
i修改
d删除第二行
sed -i '2d' test.txt
删除
删除第2行
m,n 表示对m和n行之间的所有行进行操作,也包含第m行和第n行
m,$ 表示对m行以及其后面的所有行进行操作
2d表示仅仅删除第2行
[root@localhost string]# sed '2d' t1.txt > t4.txt
[root@localhost string]# cat t4.txt
t1t1t1t1t1t1t1t1t1t1t1t1t1
删除以2开头的行
sed '/^2/d' test.txt
删除包含2的文件
sed '/2/d' test.txt
新增:a后i前c替换行s替换字符串
sed '1a hello world' test.txt
其中a命令表示在指定行的后面附加一行,1a则是在第一行的后面添加一行,添加的内容就是a后面的内容,如
果a的前面没有地址限定则在所有行的后面都会添加指定的字符串
sed '1i hello world' test.txt
命令i表示在指定的行的前面插入一行,插入的内容为其后面的字符串
sed '1c hello world' test.txt
命令c会替换指定的行的所有内容,替换成其后面的字符串,所有的新增,删除,替换行,这些命令前面的地址
修饰都可以指定地址空间,也都可以使用正则表达式,命令会应用在选出的符合地址条件的所有行上面,如:
sed '/^2/c hello world' test.txt
替换以2开头的行,其内容是c命令后面的字符串
替换部分字符串而不是整行
sed 's/aa/AA/' test.txt
s/待替换的字符串/新字符串/ 也就是说使用后面的 AA 替换文件中出现的前面的 aa
sed '1s/aa/AA/g' test.txt
加上g选项之后,全局替换,也就说一行中所有符合条件的旧字符串都会被替换成新字符串,而不仅仅是第一个
可以看到仅仅对第一行进行了替换操作,其他的地址限定方法同样也是可以使用的,我们可以使用m,n的限定,
sed '5,$s/aa/AA/g' test.txt
sed '/^[0-9]/s/aa/AA/g' test.txt
我们在s命令前面添加了 /^[0-9]/ 这个修饰,该正则表达式表示对所有以数字开头的行,执行s操作
元字符
$ 表示行尾
^ 表示行首
[a-z0-9]表示字符范围
[^]表示除了字符集中的字符以外的字符
sed的正则中 \(\) 和 \{m,n\} 需要转义
. 表示任意字符
* 表示零个或者多个
\+ 一次或多次
\? 零次或一次
\| 表示或语法
例子
sed -n '/^2011-08-23.*ERROR/p' demolog.log
2011-08-23 19:57:30,709 [] ERROR bo.CommodityCerOrderBO - order-fi
2011-08-23 19:57:31,721 [] ERROR bo.CommodityCerOrderBO - order-f
提取demo.log中的日期,日志级别,订单id和状态。
sed -f demo.sed2 demo.log
#下面的一行是替换指令,就是把19位长的日期和INFO/ERROR,id,和后面的一截提取出来,然后用@分割符把这
4个字段重新按顺序组合
s/^\([-\: 0-9]\{19\}\).*\(INFO\|ERROR\) .*order-fix.curr_id:\([0-9]\+\),\(.*$\)/\1@\3@\2@\4/p
输出:
2011-08-23 19:57:30@10117@INFO@status:attr_ids不含0跳过
2011-08-23 19:57:30@10117@ERROR@status:添加属性id,但由于认证分类参数有误默认取匹配属性名称的第
一个属性id:100104
2011-08-23 19:57:31@10117@ERROR@status:添加属性id,但由于认证分类参数有误默认取匹配属性名称的第
一个属性id:100105