sed

–stream editor for filtering and transforming text

–是一个非交互的流编辑器,过滤和改变文本文件的。

选项

-n 取消默认的输出 ,使用安静(silent)模式。
-e 允许多项编辑 (-e ‘定址 操作’ -e ‘定址 操作’ 或 ‘定址 操作; 定址 操作’)
-r 支持扩展正则表达式
-i 直接修改原文件,在 -i 的后面加上一些其他的字符,会给原文件做一个备份。
-f 接sed 脚本文件

p|打印匹配行

打印匹配到root的行

[alvin@poppy ~]$ sed -n '/root/p' passwd

打印1至10行

[alvin@poppy ~]$ sed -n '1,10p' passwd

打印第五行

[alvin@poppy ~]$ sed -n '5p' passwd

打印匹配到root的行到匹配到ftp的行之间所有的行

[alvin@poppy ~]$ sed -n '/root/,/ftp/p' passwd

打印除7至10行之外的所有行,!是取反

[alvin@poppy ~]$ sed -n '7,10!p' passwd

d|删除

删除第3行

[alvin@poppy ~]$ sed '3d' passwd,

删除1至3行

[alvin@poppy ~]$ sed '1,3d' passwd

删除包含root的行

[alvin@poppy ~]$ sed '/root/d' passwd

删除包含root到包含mail之间所有的行

[alvin@poppy ~]$ sed '/root/,/mail/d' passwd

s///替换

替换换行符为+

这里我们将所有行合并了,将换行符替换成了+号。

sed ':a;N;s/\n/+/g;ta' 1.txt

使用前面匹配到的内容

匹配替换时,&会变成起那么匹配到的内容,所以在下面的例子中,我们前面匹配所有内容,然后替换为#&就是#加上所有内容。

sed -in '160,164s/.*/#&/' $Setfiles

删除文件 text中第一列

sed -e 's/[^ ]* //' text

将每行第一个root替换成为alvin

[alvin@poppy ~]$ sed 's/root/alvin/' passwd

将所有的root都替换为alvin

[alvin@poppy ~]$ sed 's/root/alvin/g' passwd

将第一行所有的root替换为clear

[alvin@poppy ~]$ sed '1 s/root/clear/g' passwd

将第一行第二个root替换为clear

[alvin@poppy ~]$ sed '1 s/root/clear/2' passwd

删除所有行的第一个root

[alvin@poppy ~]$ sed ‘s/root//’ passwd

删除全部的root

[alvin@poppy ~]$ sed 's/root//' passwd

删除第二行第三个root

[alvin@poppy ~]$ sed ‘2 s/root//3’ passwd

删除每行第一个字母

“^”代表行首,“.”代表一个任何字符,所有“^.”就代表第一个字符。

[alvin@poppy ~]$ sed 's/^.//' passwd

删除每行第一个单词

[alvin@poppy ~]$ sed 's/^\<[a-Z]*[a-Z]\>//' passwd

将153和158行的#替换为空

sed -in '153,158s/#//' $Setfiles

a|在匹配的行的下面添加内容

匹配行后增加指定内容

a是append, 在匹配行后面增加一行指定内容,下面是在file文件里在匹配到aa的行的后面增加内容qqq

sed -i /aa/a\qqq file

在第4行的下面添加clear

[alvin@poppy ~]$ sed '4a clear' passwd

在最后一行的下面添加clear

[alvin@poppy ~]$ sed '$a clear' passwd

在匹配到nologin的行的下面添加clear

[alvin@poppy ~]$ sed '/nologin/a clear' passwd

i|保存修改文件

i|在匹配行的上面添加内容

这里的i是insert, 在匹配行前面插入一行指定内容,下面是在file文件里在匹配到aa的行的前面增加内容qqq

sed -i /aa/i\qqq file

修改一个文件时,备份源文件

[root@cl210controller ~]# cat 2.txt
a b c d e
[root@cl210controller ~]# sed -i.bak 's/c/666/' 2.txt
[root@cl210controller ~]# cat 2.txt
a b 666 d e
[root@cl210controller ~]# cat 2.txt.bak
a b c d e

在第一行上面添加clear

[alvin@poppy ~]$ sed '1i clear' passwd

在匹配到nologin的行的上面添加clear

[alvin@poppy ~]$ sed '/nologin/i clear' passwd

c|替换匹配到的行

将包含nologin的行替换为clear

[alvin@poppy ~]$ sed '/nologin/c clear' passwd

将第2行替换成clear

[alvin@poppy ~]$ sed '2c clear' passwd

分组替换

在做替换时,如果将前面的用户用括号()包裹起来了,那么可以在后面调用,第一个括号就是1,使用分组时前面加-r参数。

echo 'CONFIG_CINDER_KS_PW=sda3d34dd235d'|sed -r 's/(.+_PW)=[0-9a-z]+/\1=redhat/'

匹配行替换

“”中第一列为匹配内容,第二列s表示要进行替换,第三列aa表示匹配aa,第四列6666表示将匹配到的aa替换为6666

[root@localhost ~]# cat 1
aaa
bbb
ccc
[root@localhost ~]# sed "/aa/s/aa/66666/" 1
66666a
bbb
ccc

删除匹配行到最后一行

sed -i '/label linux/,$d'  myiso/isolinux/isolinux.cfg

替换换行符为空格

sed -i ':a;N;$!ba;s/\n/ /g' text