sed全名是stream editor,文本的流式处理器。所谓的流式是与交互式相对的,交互式处理器比如vim。
用法:
1)行内替换;
使用s命令,格式为sed "s/pattern/replacement/flags"。
pattern是新内容,replacement是老的要被替换的内容,支持Basic RE。
flags是替换选项,总共有以下四种:
a)数字,表示替换第几处,模式只替换匹配的第一处;
b)g,整行内所有匹配到的全部替换;
c)p,仅将匹配到的行打印出来,这个一般和-n一起使用,-n表示忽略sed本身的输出,也就是仅仅打印匹配出的内容;
d)w,将替换的结果写入文件中。
例子:
miracle@localhost:~|⇒ echo "aaabbbaaa" | sed "s/aaa/ccc/"
cccbbbaaa
默认不加flags,只替换匹配到的第一处。
miracle@localhost:~|⇒ echo "aaabbbaaa" | sed "s/aaa/ccc/g"
cccbbbccc
加上g,整行内所有匹配到的都被替换。
miracle@localhost:~|⇒ echo "aaabbb\naaa" | sed -n "s/aaa/ccc/p"
cccbbb
ccc
miracle@localhost:~|⇒ echo "aaabbb\naaa" | sed "s/aaa/ccc/p"
cccbbb
cccbbb
ccc
ccc
如果不加-n,将会输出两次,这是因为第一次是sed命令的输出,第二次是p标记的输出,如果加上了-n,那么会省去sed命令的输出,结果更清楚。
miracle@localhost:~|⇒ echo "aaabbb\naaa" | sed "s/aaa/ccc/w a.txt"
cccbbb
ccc
miracle@localhost:~|⇒ cat a.txt
cccbbb
ccc
使用w标记将替换结果保存在一个文件中。
2)使用地址
sed命令都可以加入地址,用来指定行号。
格式为[address]commend
举个例子:
只替换第一行,在s命令前指定行号1即可:
miracle@localhost:~|⇒ echo "aaabbb\naaa" | sed "1s/aaa/ccc/w a.txt"
cccbbb
aaa
还可以指定范围,使用n,m的格式即可:
miracle@localhost:~|⇒ echo "aaabbb\naaa\naaa" | sed "2,3s/aaa/ccc/g"
aaabbb
ccc
ccc
或者使用$来指定尾行,要加转义符:
miracle@localhost:~|⇒ echo "aaabbb\naaa\naaa" | sed "2,\$s/aaa/ccc/g"
aaabbb
ccc
ccc
3)文本过滤器:
格式为/pattern/command
首先说一下这个用法的作用,不是可以通过s命令加正则匹配搞定过滤和替换吗,为什么还要加一个过滤器?
因为,有时匹配和替换是分开的,比方说要搜出带有xxx的行,将其内部的yyy替换为zzz。
例子:
miracle@localhost:~|⇒ echo "aaabbb\naaa\naaa" | sed "/bbb/s/aaa/ccc/g"
cccbbb
aaa
aaa
这里仅仅将包含有bbb的行中的aaa替换为ccc。
注意这里介绍的寻址和过滤器可以用于sed所有的命令上,插入删除修改等等。
4)删除命令:
格式为/addredd/d
比如:
miracle@localhost:~|⇒ echo "aaabbb\naaa\naaa" | sed "/bbb/d"
aaa
aaa
将包含bbb的行删除掉。
5)插入和追加(IOS好像不支持)
格式为/address/cmd newLine
这里的cmd可以为:
i\:表示在匹配行前插入新行;
a\:表示在匹配行后插入新行;
miracle@localhost:~|⇒ echo "aaabbb\naaa\naaa" | sed "/bbb/i\hhh":
在包含bbb的行的前面插插入。
miracle@localhost:~|⇒ echo "aaabbb\naaa\naaa" | sed "2a\hhh"
在第二行后面插入。
6)修改行
这个用法和插入追加是一样的,与s命令的区别在于这个命令是整行修改的。
/address/c\ newLine
另外sed命令默认是不修改原文件的,如果想要修改可以添加-i参数。
标签:shell,aaa,naaa,aaabbb,命令,sed,localhost,ccc From: https://blog.51cto.com/u_15873544/5844089