引 入
sed文本处理三剑客之一(grep,sed,awk),主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作,下面来简单介绍一下sed。
一、sed工作原理:
sed处理文件流程:
1、一行一行地,把读取到的文件copy到sed自己的工作车间中,即模式空间中。
2、在模式空间中判断这一行是否被相关条件所匹配。
匹配到的,做相关的编辑处理,然后输出。
匹配不到的,默认标准输出。
注意:除了模式空间,sed还有另外一个内存处理空间,我们称为保持空间,这两个空间的内容可以有交互,不过我们一般很少用到。
二、sed用法:
sed [OPTION]... 'script' [input-file] ...
script:
地址定界编辑命令
常用选项:
-n:不输出模式空间中的内容至屏幕;默认是输出的。
-e script, --expression=script:多点编辑;
-f /PATH/TO/SED_SCRIPT_FILE
每行一个编辑命令;
-r, --regexp-extended:支持使用扩展正则表达式;
-i[SUFFIX], --in-place[=SUFFIX]:直接编辑原文件 ;危险行为,慎用。
地址定界:
(1) 空地址:对全文进行处理;
(2) 单地址:
#:指定行;
/pattern/:被此模式所匹配到的每一行;
(3) 地址范围
#,#:
#,+#:
#,/pat1/
/pat1/,/pat2/
$:最后一行;
(4) 步进:~
1~2:所有奇数行
2~2:所有偶数行
编辑命令:
d:删除;
p:显示定界选定的模式空间中的内容;
a \text:在行后面追加文本“text”,支持使用\n实现多行追加;
i \text:在行前面插入文本“text”,支持使用\n实现多行插入;
c \text:把匹配到的行替换为此处指定的文本“text”;
w /PATH/TO/SOMEFILE:保存模式空间匹配到的行至指定的文件中;
r /PATH/FROM/SOMEFILE:读取指定文件内容至当前文件被模式匹配到的行后面;文件合并;
=:为模式匹配到的行打印行号;
!:条件取反;
用法:地址定界!编辑命令;
s///:查找替换,其分隔符可自行指定,常用的有s@@@, s###等;
替换标记:
g:全局替换;
w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中;
p:显示替换成功的行;
三、sed实例:
文件:sedTest.txt
northwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13
1)找到以north开头的行并在其后添加很多FUCK
[root@node1 tmp]# sed '/^north/a\FUCK' sedTest.txt
northwest NW Charles Main 3.0 .98 3 34
FUCK
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
FUCK
north NO Margot Weber 4.5 .89 5 9
FUCK
central CT Ann Stephens 5.7 .94 5 13
[root@node1 tmp]#
2)把有south的行全部用FUCK取代
[root@node1 tmp]# sed '/south/c\FUCK' sedTest.txt
northwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
FUCK
FUCK
FUCK
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13
[root@node1 tmp]#
3)删除1-4行
[root@node1 tmp]# sed '1,4d' sedTest.txt
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13
[root@node1 tmp]#
4)寻找大于1少于10的一位小数并用FUCK+&替代。这里的&保存了前面的小数
[root@node1 tmp]# sed 's/[0-9]\.[0-9]/FUCK&/g' sedTest.txt
northwest NW Charles Main FUCK3.0 .98 3 34
western WE Sharon Gray FUCK5.3 .97 5 23
southwest SW Lewis Dalsass FUCK2.7 .8 2 18
southern SO Suan Chin FUCK5.1 .95 4 15
southeast SE Patricia Hemenway FUCK4.0 .7 4 17
eastern EA TB Savage FUCK4.4 .84 5 20
northeast NE AM Main Jr. FUCK5.1 .94 3 13
north NO Margot Weber FUCK4.5 .89 5 9
central CT Ann Stephens FUCK5.7 .94 5 13
[root@node1 tmp]#
5)显示仅包含north的行
[root@node1 tmp]# sed -n '/north/p' sedTest.txt
northwest NW Charles Main 3.0 .98 3 34
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
[root@node1 tmp]#
6)显示奇数行
[root@node1 tmp]# sed -n '1~2p' sedTest.txt
northwest NW Charles Main 3.0 .98 3 34
southwest SW Lewis Dalsass 2.7 .8 2 18
southeast SE Patricia Hemenway 4.0 .7 4 17
northeast NE AM Main Jr. 5.1 .94 3 13
central CT Ann Stephens 5.7 .94 5 13
[root@node1 tmp]#
7)从第4行开始显示,并且把Hemenway改为Jones
[root@node1 tmp]# sed '1,3d;s/Hemenway/Jones/g' sedTest.txt
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Jones 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13
[root@node1 tmp]#
本题实现的另一写法:sed -e '1,3d' -e 's/Hemenway/Jones/g' sed.txt
四、补充sed的高级用法:
高级编辑命令:
h:把模式空间中的内容覆盖至保持空间中;
H:把模式空间中的内容追加至保持空间中;
g:把保持空间中的内容覆盖至模式空间中;
G:把保持空间中的内容追加至模式空间中;
x:把模式空间中的内容与保持空间中的内容互换;
n:覆盖读取匹配到的行的下一行至模式空间中;
N:追加读取匹配到的行的下一行至模式空间中;
d:删除模式空间中的行;
D:删除多行模式空间中的所有行;
示例:
sed -n 'n;p' FILE:显示偶数行;
sed '1!G;h;$!d' FILE:逆序显示文件的内容;
sed ’$!d' FILE:取出最后一行;
sed '$!N;$!D' FILE:取出文件后两行;
sed '/^$/d;G' FILE:删除原有的所有空白行,而后为所有的非空白行后添加一个空白行;
sed 'n;d' FILE:显示奇数行;
sed 'G' FILE:在原有的每行后方添加一个空白行;
结 语
sed功能非常强大,熟练的使用会给我们在做文本编辑的时候带来想不到的方便。不过它在处理列的时候还是比不过awk,下一篇我们来说说awk。
附:如对上面描述有疑问,期待与朋友您共同探讨。