sed应用详解
sed是文本处理处理工具“三大剑客”之一,它 是一种流编辑器,sed一次只处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern
space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。sed不会修改原文件内容,除非你使用重定向存储输出。sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等。
用法:sed [OPTION]… {script-only-if-no-other-script} [input-file]…
sed可依照script来处理文本文件,skript又包含地址定界和编辑命令。地址定界是指定要处理的文件范围,比如只处理文件的前十行内容,或者只处理文件的奇数行等,编辑命令是指对指定范围的内容进行怎样的处理,比如在屏幕上打印显示,或者删除、替换等操作,地址定界和编辑命令必须配合使用,如果不指定地址定界则默认对全文进行处理。sed本身也有选项参数,常用的选项参数如下所示:
-n:仅显示经过script处理后的结果,默认情况下,sed会自动打印模式空间的内容
-e:可以指定多个script同时处理
-f /path/to/script_file:从指定的文件中读取脚本并运行
-r:支持使用扩展正则表达式
-i:直接修改源文件
script地址定界的方式有:
(1)若不指定范围则表示处理全文
(2)#:#代表数字,指定行号
(3)/pattern/:模式匹配,被/pattern/匹配到的所有行
(4)#1,#2:表示从第#1行到第#2行之间所有的行
(5)#,+n:表示从第#行开始再向下n行之间的所有行
(6)/pat1/,/pat2/:表示从第一次被/pat1/匹配到的行开始,到第一次被/pat2/匹配到的行结束,中间所有的行
(7)#,/pat1/:表示从第#行开始,到第一次被/pat1/匹配到的行结束,之间所有的行
(8)first~step:表示指定起始行以及步长,比如1~2,1代表起始行,2代表步长,匹配到的行即为1,3,5,7…(奇数行)
(9)$:表示最后一行
script编辑命令有:
d:删除模式空间中的行
[root@fengl testdir]# cat test #先查看test原文件内容 1aaaaaaaaaaaaaaaa 2bbbbbbbbbbbbbbbb 3cccccccccccccccc 4dddddddddddddddd 5eeeeeeeeeeeeeeee 6ffffffffffffffff [root@fengl testdir]# sed '1d' test #删除第1行 2bbbbbbbbbbbbbbbb 3cccccccccccccccc 4dddddddddddddddd 5eeeeeeeeeeeeeeee 6ffffffffffffffff
p:打印模式空间中的行
[root@fengl testdir]# sed -n '/aaa/p' test #只打印匹配“aaa”的行 1aaaaaaaaaaaaaaaa
a \text:在当前行下面追加文本,支持使用\n实现多行追加
[root@fengl testdir]# sed '1,3a\ggggggggg' test #在1至3行下面插入“ggggggggg” 1aaaaaaaaaaaaaaaa ggggggggg 2bbbbbbbbbbbbbbbb ggggggggg 3cccccccccccccccc ggggggggg 4dddddddddddddddd 5eeeeeeeeeeeeeeee 6ffffffffffffffff
i \text:在当前行下面插入文本,支持使用\n实现多行插入
[root@fengl testdir]# sed '2,+2i\ggggggggg' test #在从第2行开始向下2行的上面插入“ggggggggg” 1aaaaaaaaaaaaaaaa ggggggggg 2bbbbbbbbbbbbbbbb ggggggggg 3cccccccccccccccc ggggggggg 4dddddddddddddddd 5eeeeeeeeeeeeeeee 6ffffffffffffffff
c \text:把选定的行改为新的文本
[root@fengl testdir]# sed '/a/,/c/c\ggggggggg' test #将第一次匹配到的‘a’所在行至‘c’所在行之间的所有内容更改为“ggggggggg” ggggggggg 4dddddddddddddddd 5eeeeeeeeeeeeeeee 6ffffffffffffffff
=:为模式空间中的行打印行号
[root@fengl testdir]# sed -n '3,/f/=' test #只显示从第3行开始到第一次匹配到“f”所在行之间的所有行的行号 3 4 5 6
s/regexp/replacement/:查找替换,替换由regexp所匹配到的内容为replacement,支持使用其他分隔符,条件是该分隔符在后面的模式中没有出现过,如s@@@或s###,对于替换还有后选项,如下:
g:全局替换
p:显示替换成功的行
i:不区分大小写
[root@fengl testdir]# sed '1~2s/e/g/' test #将奇数行中匹配到的第一个“e”替换成“g” 1aaaaaaaaaaaaaaaa 2bbbbbbbbbbbbbbbb 3cccccccccccccccc 4dddddddddddddddd 5geeeeeeeeeeeeeee 6ffffffffffffffff [root@fengl testdir]# sed '1~2s/e/g/g' test #将奇数行中所有匹配到的“e”替换成“g” 1aaaaaaaaaaaaaaaa 2bbbbbbbbbbbbbbbb 3cccccccccccccccc 4dddddddddddddddd 5gggggggggggggggg 6ffffffffffffffff [root@fengl testdir]# sed -n '1~2s/e/g/p' test #将奇数行中所有匹配到的“e”替换成“g”,并只显示替换的行 5geeeeeeeeeeeeeee
w/path/to/somefile:把指定的内容另存至/path/to/somefile路径所指定的文件中
[root@fengl testdir]# sed -n '1,4w/testdir/testsave' test #将test文件中的1至4行内容另存到/testdir/目录下的testsave文件中 [root@fengl testdir]# cat testsave #查看testsave文件 1aaaaaaaaaaaaaaaa 2bbbbbbbbbbbbbbbb 3cccccccccccccccc 4dddddddddddddddd
r/path/form/somefile:在文件的指定位置插入另一个文件的所有内容,完成文件合并
[root@fengl testdir]# sed '3r/testdir/text' test #将/testdir/text文件中的内容插入到test文件的第3行下面 1aaaaaaaaaaaaaaaa 2bbbbbbbbbbbbbbbb 3cccccccccccccccc hhhhhhhhhhhhh iiiiiiiiiiiii jjjjjjjjjjjjj 4dddddddddddddddd 5eeeeeeeeeeeeeeee 6ffffffffffffffff
sed除了“模式空间”(pattern space)外,还有一个保持空间“hold space”。sed工作机制是每次读取一行文本至模式空间中, 在模式空间中完成处理,将处理结果输出值标准输出设备,在模式空间中处理一行内容后悔继续处理下一行,那么对于处理过的行可能还有其他的处理,因此可以先把处理过的行“传送”至保持空间中,然后在后续的处理中再次“传送”回模式空间中。
sed工具支持一些高级的命令运用到保持空间中,这些高级命令有:
h:用模式空间中的内容覆盖保持空间的内容
H:把模式空间中的内容追加至保持空间中
g:从保持空间中取出数据覆盖至模式空间
G:从保持空间中取出数据追加至模式空间
x:交换保持空间和模式空间的内容
n:读取匹配到的行的下一行覆盖至模式空间
N:读取匹配到的行的下一行追加至模式空间
d:删除模式空间中的内容
D:删除多行模式空间中的首行
注意:
!:取反,表示后面的命令对所有没有被选定的行发生作用
;:分号可用于分割脚本
示例1:
[root@fengl testdir]# sed -n 'n;p' test 2bbbbbbbbbbbbbbbb 4dddddddddddddddd 6ffffffffffffffff
sed的处理步骤为:
(1)因为n表示读取匹配到的行的下一行到模式空间中,因此第一次读取第1行时的动作是将第2行的内容覆盖至模式空间中,此时模式空间中的内容是第2行内容
(2)紧接着执行p操作,即打印模式空间的行(打印第2行内容)
(3)然后重复执行以上操作,继续读取下一行(即第3行,因为第2行已经读取过了),并将其下一行覆盖至模式空间(即模式空间的内容是第4行内容),然后再执行p操作(打印第4行内容),依次类推,直至文件读取完毕后结束sed运行
实例2:
[root@fengl testdir]# sed '1!G;h;$!d' test 6ffffffffffffffff 5eeeeeeeeeeeeeeee 4dddddddddddddddd 3cccccccccccccccc 2bbbbbbbbbbbbbbbb 1aaaaaaaaaaaaaaaa
sed的处理步骤为:
(1)读取文件的第一行内容到模式空间,因为第一行不执行G操作
(2)执行h操作,将模式空间的内容覆盖至保持空间
(3)因为不是最后一行,因此执行d操作,删错模式空间中的内容。此时模式空间内容为空,保持空间为第一行内容
(4)紧接着执行第2次循环,读取第2行内容,并执行G操作,将保持空间的内容追加至模式空间。此时模式空间为第2行和第1行内容,保持空间为第1行内容
(5)继续执行h操作,再把模式空间的内容覆盖至保持空间,因为第2行不是最后一行,然后在执行d操作,删除模式空间的内容。此时模式空间为空,保持空间为第2行和第1行内容(第1行内容在第2行下面)
(6)依次循环至文件最后一行,不执行d操作,此时模式空间的第1行内容为源文件的最后一行内容(行倒序排序),最后打印出模式空间的内容。
原创文章,作者:苦涩咖啡,如若转载,请注明出处:http://www.178linux.com/32621