linux流处理工具之sed

stream editor, 实现了正则, 主要用来进行文本替换  
一行一行(循环)的读取、处理, 对一整行的处理
先使用行号或正则进行定位, 然后进行p s d c a i

p 打印文本

s  替换文本(替换其后满足正则的字段)

d  删除文本

c  替换文本(简单的文本替换,注意与s的区别)

a  追加文本

i   插入文本


各字段用/定界符分隔, 可使用其他字符如? 进行匹配。

----------------------------------------------------------------------------------------------------------

例如:
sed ‘/abc/p‘ file1
其执行顺序:
a,读取file1的第一行到pattern space(临时缓冲区, 内存)

b,对pattern space中的这一行进行/abc/p操作(打印), 然后默认会打印pattern space中的这一行
清空pattern space

c,读取file1的下一行到pattern space


d,循环上述过程,直到file1末尾
-----------------------------------------------------------------------------------------------------------

以下是一些常用方法:

sed -i ‘s/abc/def/‘ file1

#将包含abc字段的行的第一个abc替换为def。

sed -n ‘5p‘ file1

#打印第5行

sed -n ‘1,5p‘ file1

#打印1至5行

sed -n ‘$p‘ file1

#打印文本最后一行

sed -n ‘/^root/p‘ file1

#打印以root开头的行



sed ‘3i abc‘ file1  

#打印文件,并向第三行插入abc,但是并不修改文件内容。接上-i选项则可以修改文件内容。


sed ‘$a abc‘ file1  

#打印文件,并向最后一行插入abc,也不会修改文件内容。接上-i选项则可以修改文件内容。

sed -i ‘2,4s/.*/abc/‘ file1

#将文件2、3、4的内容替换为abc


echo "30%" | sed ‘s/%//‘

#去除%符号。

sed ‘/localhost/a ds.com‘ file1

#打印文件,并向localhost后追加一行ds.com。


sed ‘/root/c aixocm‘ file1  

#打印文件,将root字段替换为aixocm字段。

sed ‘/abc/d‘ file1

#打印文件,删除包含abc的行。


sed ‘/abc/!d‘ file1

#打印文件,删除不包含abc的行


sed ‘3d‘ file1  

#打印文件,删除第3行。


sed ‘1,3d‘ file1

#打印文件,删除1至3行。


sed ‘3,$d‘ file1

#打印文件,删除第3行至最后一行。


sed ‘/^$/d‘ file1  

#打印文件,删除空行。


sed ‘/^\s*$/d‘ file1

#打印文件,删除以任意多个空格开头且以任意字符结尾的行。

sed ‘s/root/ROOT/‘ file1  

#打印文件,将含有root字段的那一行的第一个root替换为ROOT。


sed ‘s/root/ROOT/g‘ file1

#打印文件,将含有root字段的那一行的所有root替换为ROOT。


sed ‘s/root/ROOT/2‘ file1

#打印文件,将含有root字段的那一行的第二个root替换为ROOT。


sed ‘/tom/s/jerry/mike/g‘ file1

#打印文件,先查找含有tom字段的行,然后将这些行的jerry替换为mike。

echo "ab/c def" | sed ‘s/ab\/c/xyz/‘

#将ab/c字段替换为xyz,\/是用作转义。


echo "a b c" | sed ‘s/ //g‘

#将所有的空格替去除。


引用变量
var1="root"
sed "/$var1/c aixocm" file1

#打印文件,将与变量var1的值相同的字段替换为aixocm。

#注意:要使用双引号,单引号会使$符号失去取变量值作用。

行首加# 号
sed ‘/ADDR/s/^/#/‘ file1

#打印文件,找到含有ADDR字段的行,然后在这些行首插入一个#字符。

去行首# 号
sed ‘/ADDR/s/^#//‘ file1

#打印文件,找到含有ADDR字段的行,然后将这些行首的#字符去除。

多次操作
sed ‘3s/abc/def/; 5s/abc/xyz/‘ file1

#打印文件,将第3行的abc替换为def,然后再将第5行额abc替换为xyz。


sed -e ‘1,3d‘ -e ‘s/tom/jerry/‘ file1

#打印文件,将1至3行删除,然后再将含有tom的行的第一个tom字段替换为jerry。

& 保存查找串以便在替换串中引用
sed ‘s/tom/&jerry/‘ file1

#这个&符号可以理解为tom字段的引用,即&jerry等价与tomjerry。

范围匹配
#范围匹配,如果含有多组范围字符串,则每组范围内的所有行都会进行操作。


sed ‘/abc/,/xyz/s/tom/jerry/‘ file1

#将文件中所有的abc字段到xyz字段之间的行的第一个tom替换为jerry。


sed ‘/tom/,/jerry/d‘ file1  

#删除文件中第所有tom字段到jerry字段之间的所有行(包括tom和jerry所在的行)。


sed -n ‘/abc/,/xyz/p‘ file1

#与上面类似,打印范围字段之间的所有行。


sed ‘1,/tom/d‘ file1

#将第1行到第1个匹配tom的行之间的行进行删除(包括第一行和tom所在的那行)。


ip=10.0.8.88
sed -i "/^IPADDR/s/[0-9.]+/$ip/" ifcfg-eth0  

#将ipcfg-eth0文件中,找到IPADDR开头的行,将这行的任意多个数字或.组成的文本替换

#为$ip的内容,即实现了修改ip地址的功能。


====================================================


以上纯属个人理解,如有错误之处,敬请指正。

指导老师:双星科技葛老师




本文出自 “Helloween” 博客,请务必保留此出处http://6368580.blog.51cto.com/6358580/1398130

linux流处理工具之sed,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。