sed:(stream editor)流编辑器

逐行读入,逐行编辑。只处理模式空间,同时还有保留空间。

sed命令将符合条件的内容读取至模式空间内,只处理模式空间内的内容,默认不对源文件进行修改。然后将操作的结果输出到屏幕上。


#sed [OPTION] '[PATTERN][COMMAND]' INPUTFILE

[OPTION]

-n --quiet 静默模式。使用此选项后只打印指定条件的行。不显示模式空间内的内容。


-r 使用扩展的正则表达式。


-i 直接修改源文件。


-f SCRIPTFILE 

使用名为SCRIPTFILE的脚本文件作为匹配条件。

CSRIPTFILE中每一行内容为一个匹配条件。



-e SCRIPT1 [-e SCRIPT2]....

使用-e可以在命令中使用多个脚本。



[PATTERN]([ADDRESS]定界地址):

1.STARTLINE[,ENDLINE]|[, +NUM]开始行和结束行。

只有一个行号表示精确指定某行。

+NUM表示以STARTLINE开始,向后NUM行。总计是NUM+1行。



例如:

1,100

33

2,+5



2.$ 最后一行

例如:

$-1 倒数第二行。


3.~ 跨步数值 指定一个行数的步进值。


4./RegExp/ 使用//将正则表达式圈起来。

例如:

/^root/


5./PATTERN1/,/PATTERN2/ 

第一次被PATTERN1匹配到的行开始,至第一次被PATTERN2匹配到的行结束。 


6.'$SHELL'使用shell变量的话用''引起来。


7.; 多命令用;隔开


[COMMAND]

p:打印。显示符合条件的行。


a \ STRING:

在匹配到行后追加新行,内容为STRING,STRING中有空格要用''引起来

追加多行使用\n换行来实现。


i \ STRING:

在匹配到行前追加新行,内容为STRING。

插入多行和a \  相同,也使用时\n换行来实现。


c \ :替换某个符合条件的行。


r FILE:

从FILE中读文件内容并追加到符合条件的行处。


w FILE:

将指定范围内的内容另存为至指定的文件FILE中。



y:

y/OLD/NEW/ 逐个字符对应替换,将OLD中的内容依次替换成NEW中的内容。


d:删除符合条件的行。


s:查找并替换,默认只替换每行中第一次被模式匹配到的字符串。

s/OLDSTR/NEWSTR/FLAG

OLDSTR 支持正则表达式。


NEWSTR 不支持正则表达式

&:表示OLD里边的内容。

\U:把\U后边的字符全部转为大写。

\u:把\u后边的第一个字符变成大写。

\L:把\L后边的字符全部转为小写。

\l:把\l后边的低格字符变成小写。

\E:终止


FLAG

g 全局替换。

i 查找时忽略大小写。

p 打印符合条件内容到屏幕上。


后向引用:

\(\),\1,\2...



&:引用模式匹配整个串。


!;取反。这个写在[COMMAND]之前。


= 显示当前行的行号


例如:

#sed '1,2d' /etc/fstab 不显示/etc/fstab中的1和2行。

#sed '3,$d' /etc/fstab 只显示/etc/fstab的1和2行。

#sed '/oot/d' /etc/fstab 不显示包含oot的行。

#sed '1,+2d' /etc/fstab 不显示前三行。

#sed '1d' /etc/fstab 不显示第一行。

#sed '/^\//d' /etc/fstab 不显示以斜线开头的行。

#sed  -n '/^\//p' /etc/fstab  显示以斜线开头的行。


#sed  '/^\//a \#hello world\n#hello linux' /etc/fstab  显示以斜线开头的行,并在后边加上#hello world换行后添加#hello linux。


#sed '2r /etc/issue' /etc/fstab 将/etc/issue的内容添加到/etc/fstab文件的第二行后。


#sed '1,2r /etc/issue' /etc/fstab 将/etc/issue的内容添加到/etc/fstab文件的第一行和第二行后。


#sed -n '/^oot/w /tmp/oot.txt' /etc/fstab 将/etc/fstab中以oot开头的行,另存到/tmp/oot.txt这个文件中。


#sed -n 's/oot/Oot/' /etc/fstab 将/etc/fstab中oot替换为Oot


sed -n 's/^\//#/' /etc/fstab 将/etc/fstab中以斜线开头行中的斜线替换为#。


sed -n 's@^/@#@' /etc/fstab 将/etc/fstab中以斜线开头行中的斜线替换为#。


sed -n 's/l..e/&r/g' /tmp/sed.txt 将/tmp/sed.txt中符合l..e的内容全部替换为l..er。


sed -n 's#\(l..e\)#\1r#g' /tmp/sed.txt 将/tmp/sed.txt中符合l..e的内容全部替换为l..er。


sed -n 's#^l\(..e\)#L\1r#g' /tmp/sed.txt 将/tmp/sed.txt中符合l..e的内容全部替换为L..er。


#sed 's/\[.*\]/\U&/g' /etc/samba/smb.conf 将smb.conf中的[]内的小写转为大写字符。


#history | sed 's/^[[:space:]]*//g' 删除history中开头的空白字符。



练习:

1.删除/etc/grub.conf文件中行首的空白符

sed -r 's#^[[:space:]]+##g' /etc/grub.conf



2.替换/etc/inittab文件中"id:3:initdefault:"一行中的数字为5

sed 's#\(id:\)[0-9]\(:initdefault\)#\15\2#g' /etc/inittab


3.删除/etc/inittab文件中的空白行

sed '^$d' /etc/inttab 


4.删除/etc/inittab文件中开头的#号

sed 's@^#@@' /etc/inittab

5.删除某文件中开头的#号及后边的空白字符,但要求#后边必须有空白字符

sed -r 's@^#[[:space:]]+@@g' test.txt


6.删除某文件中以空白字符后边跟#类的行开头的空白字符以及#

sed -r 's@^[[:space:]]+#@@g' test.txt


7.取出一个文件路径的目录名称

echo "/etc/inittab"|sed -r 's@^(/.*/)[^/]+?/@\1@g'


8.取出一个文件路径的基名

echo "/etc/inittab"|sed -r 's@/.*/([^/]+?)/@\1@g'