首页 > 代码库 > shell编程(七)--- sed的用法

shell编程(七)--- sed的用法

sed:称为流编辑器,也称为行编辑器。

sed处理过程:sed读取源文件中的一行,并将其放在临时缓冲区中,这个缓冲区称为模式空间,使用相应的模式对模式空间进行处理,并将处理的结果显示到屏幕上,并不会影响源文件,处理结束后,将模式空间中的内容显示至屏幕。


sed格式:

sed [options] ‘AddressCommand‘ file ...

options:
-n:静默模式,不显示模式空间中的内容,默认显示默认空间中的内容。常和p命令一起使用。
-i:直接修改源文件的内容。
-e ‘AddressCommand‘ -e ‘AddressCommand‘:同时执行多个脚本。
-f:指定sed脚本文件的路径。
-r:默认情况下,sed只支持基本的正则表达式,如果要使用扩展表达式,需要用-r选项。

Address格式

1.StartLine,EndLine
如:
1,100:表示的是从第一行到第100行。
$:表示的是最后一行。
2./RegEXP/
正则表达式。
如:/^root/以root开头的行。
3./pattern1/,/pattern2/
表示的是从第一次被pattern1模式匹配的行开始,到第一次配patter2匹配的行结束,中间的所有行。
4.LineNumber
表示的一个指定的行号。
5.StartLine,+N
表示的是从startline行开始,向后的N行,总共N+1行,包括当前行和后面的N行。


Command格式

d:删除符合条件的行。
p:显示符合条件的行。
a \"string":在指定的行后面追加新行,内容为string。如果想追加多行的话,需要使用\n。

示例:

[root@Server3 tmp]# cat bond0 | sed ‘/USERCTL/a \Hello1\nHello2‘
DEVICE=bond0
BOOTPROTO=none
ONBOOT=yes
TYPE=Ethernet
IPADDR=172.17.100.252
NETMASK=255.255.255.0
GATEWAY=172.17.100.2
USERCTL=no
Hello1
Hello2
IPV6INIT=yes
[root@Server3 tmp]#
i \string:在指定行的前面添加新行,内容为string。添加多行,使用\n。
r file:在指定行的后面读取file文件的内容并添加到行后。
w file:将指定范围内的内容另存至file文件中。
s/pattern/string/ :将pattern匹配到的内容替换为string。只对每行中第一个被模式匹配到的字符串进行替换。
s/pattern/string/g :将pattern匹配到的内容替换为string。对每行中的所有被匹配的模式进行替换。
s/pattern/string/i :将pattern匹配到的内容替换为string,在查找时,忽略大小写。
注意:s后面的/可以是分隔符,其他的很多字符也都可以作为分隔符,如s#root#frame#g这种格式。


pattern中的元字符

^:行首定位符。如/^my/表示匹配所有以my开始的行。
$:行尾定位符。如/my$/表示匹配所有以my结尾的行。
.:匹配除换行符以外的任意单个字符。如/m..y/  匹配包含字母m,后跟两个任意字符,再跟字母y的行。
*:表示匹配前一个字符出现0次或多次。如/my*/  匹配包含字母m,后跟零个或多个y字母的行。
[]:表示匹配范围内的任意一个字符。如/[Mm]y/  匹配包含My或my的行。
[^]:表示匹配不再指定范围外的任意一个字符。如/[^Mm]y/  匹配包含y,但y之前的那个字符不是M或m的行。
\(..\):保存已匹配的字符。如1,20s/\(you\)self/\1r/  标记元字符之间的模式,并将其保存为标签1,之后可以使用\1来引用它。最多可以定义9个标签,从左边开始编号,最左边的是第一个。此例中,对第1到第20行进行处理,you被保存为标签1,如果发现youself,则替换为your。
&:保存查找串以便在替换串中引用。如s/my/**&**/  符号&代表查找串。my将被替换为**my**
\<:词首定位符。如/\<my/  匹配包含以my开头的单词的行。
\>:词尾定位符。如/my\>/  匹配包含以my结尾的单词的行。
x\{m\}:连续m个x。如/9\{5\}/ 匹配包含连续5个9的行。
x\{m,\}:至少m个x。如/9\{5,\}/  匹配包含至少连续5个9的行
x\{m,n\}。至少m个,但不超过n个x。如/9\{5,7\}/  匹配包含连续5到7个9的行
如下这些同样可用:
[:alnum:]  [:alpha:]  [:blank:]  [:cntrl:]
[:digit:]  [:graph:]  [:lower:]  [:print:]
[:punct:]  [:space:]  [:upper:]  [:xdigit:]





本文出自 “HeZhang” 博客,请务必保留此出处http://hezhang.blog.51cto.com/1347601/1435548