此次博文介绍一下文本处理三剑客中的sed工具(点击查看grep工具http://www.178linux.com/83512)
介绍sed:
sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。
运行过程:
sed编辑器逐行处理文件,并将结果发送到屏幕。具体过程如下:首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理模式空间中的行,完成后把该行打印到屏幕上。sed每处理完一行就将其从模式空间删除,然后将下一行读入,进行处理和显示。处理完输入文件的最后一行后,sed便结束运行。sed把每一行都存在模式空间中,对这个缓存副本进行编辑,所以不会修改原文件。如果没有对行处理的话,直接把行打印到屏幕上。
sed工具的使用
(1)地址定界:
既然是对文件逐行处理,首先我们决定对哪些行进行编辑,即地址定界,如果没有指定地址,sed将处理输入文件的所有行,地址的形式可以是数字、正则表达式、或二者的结合以及其他可以表示指定行的语句。
<1>不指定地址:对全文进行处理
[root@localhost app]#sed -n 'p' test1 1 one 2 ttwo 3 three 4 fffour 5 ffffive
<2>单地址:
#: 指定的行 或 /pattern/:被此处模式(基本正则表达式)所能够匹配到的每一行
[root@localhost app]#cat test1 #假定一个实验文件 1 one 2 ttwo 3 three 4 fffour 5 ffffive [root@localhost app]#sed -n '2p' test1 #对指定行处理 2 ttwo [root@localhost app]#sed -n '/\b[a-z]\{4\}\b/p' test1 #支持模式匹配 2 ttwo
<3>范围地址:
#,# 或 #,+# 或 /pat1/,/pat2/ 或 #,/pat1/
[root@localhost app]#sed -n '2,4p' test1 #第2行到第4hang 2 ttwo 3 three 4 fffour [root@localhost app]#sed -n '2,+2p' test1 #第2行到第2+2行 ...... [root@localhost app]#sed -n '/\b[a-z]\{4\}\b/,/\b[a-z]\{6\}\b/p' test1 #模式匹配行1到模式匹配行2 ...... [root@localhost app]#sed -n '2,/\b[a-z]\{6\}\b/p' test1 #第2行到模式匹配行 ......
其他:
1~2 奇数行 或 2~2 偶数行
[root@localhost app]#sed -n '1~2p' test1 1 one 3 three 5 ffffive [root@localhost app]#sed -n '2~2p' test1 2 ttwo 4 fffour
(2)sed用法:
sed [option]… ‘script’ inputfile…
<1>sed选项:
-n :–quiet, –silent 取消默认自动打印模式空间的行
-e script :–expression=script添加“脚本”到程序的运行列表,可以实现多点编辑
-f 脚本文件 :–file=脚本文件添加“脚本文件”到程序的运行列表,换行键入命令可以实现多点编辑
-r :–regexp-extended 支持使用扩展正则表达式
-i.[扩展名] :–in-place[=扩展名] 直接修改文件(如果指定扩展名就备份文件)
-s :–separate 将输入文件视为各个独立的文件而不是一个长的连续输入,可以指定多个文件
[root@localhost app]#sed "2p" test1 #默认打印模式空间 1 one 2 ttwo 2 ttwo 3 three 4 fffour 5 ffffive [root@localhost app]#sed -n "2p" test1 #取消默认打印模式空间 2 ttwo [root@localhost app]#sed -e '2p' -e '3d' test1 #-e 多点编辑 1 one 2 ttwo 2 ttwo 4 fffour 5 ffffive [root@localhost app]#cat test2 2p 3d [root@localhost app]#sed -f test2 test1 # -f 添加文件编辑(文件内换行可以进行多点编辑) 1 one 2 ttwo 2 ttwo 4 fffour 5 ffffive [root@localhost app]#sed -rn '2,/\b[a-z]{6}\b/p' test1 #-r 支持扩展正则表达式 ...... [root@localhost app]#sed -sn '2p' passwd shadow #-s 指定多个文件 bin:x:1:1:bin:/bin:/sbin/nologin bin:*:17400:0:99999:7::: [root@localhost app]#sed -i '2p' test1 #-i 直接对原文件编辑 [root@localhost app]#sed -i.bak '2p' test1 #将原文件备份,直接编辑原文件
<2>sed命令:
sed命令告诉sed如何处理由地址定界指定的输入行
d 删除模式空间匹配的行 | a [\]text 在指定行后面追加文本支持使用\n实现多行追加 |
q 结束或者退出sed | i [\]text 在行前面插入文本 |
c [\]text 替换行为单行或多行文本 | c [\]text 替换行为单行或多行文本 |
w /path/somefile 保存模式匹配的行至指定文件 | r /path/somefile 读取指定文件的文本至模式空间中匹配到的行后 |
= 为模式空间中的行打印行号 | ! 模式空间中匹配行取反处理 |
[root@localhost app]#sed '2q' test1 #到第二行退出sed 1 one 2 ttwo [root@localhost app]#sed '2chello' test1 #将第二行替换为hello 1 one hello 3 three 4 fffour 5 ffffive
[root@localhost app]#sed '2ahello' test1 #在第二行后面添加一行hello 1 one 2 ttwo hello 3 three 4 fffour 5 ffffive
[root@localhost app]#sed '2a\ #反斜杠\ 支持多行输入 > hello\ > nihao > ' test1 1 one 2 ttwo hello nihao 3 three 4 fffour 5 ffffive
[root@localhost app]#sed '2ihello' test1 #在第二行前面添加一行hello 1 one hello 2 ttwo 3 three 4 fffour 5 ffffive [root@localhost app]#sed '2w /app/test2' test1 #将匹配到的第二行保存至文件 1 one 2 ttwo 3 three 4 fffour 5 ffffive [root@localhost app]#cat test2 2 ttwo [root@localhost app]#sed '3r /app/test2' test1 #将文件内容添加到匹配到的行后面 1 one 2 ttwo 3 three 2 ttwo 4 fffour 5 ffffive [root@localhost app]#sed '=' test1 #在每一行的上面另起一行显示行号 1 1 one 2 2 ttwo 3 3 three 4 4 fffour 5 5 ffffive [root@localhost app]#sed '2!=' test1 #取反编辑,除了匹配到的行,对其余行进行处理 1 1 one 2 ttwo 3 3 three 4 4 fffour 5 5 ffffive
s/// : 查找替换,默认替换第一个被匹配到的字符串,支持使用其它分隔符,s@@@,s###
替换标记:g :行内全局替换 p :显示替换成功的行 w :/PATH/TO/SOMEFILE : 将替换成功的行保存至文件中
[root@localhost app]#sed 's/[a-z]/#/' test1 #默认替换匹配行所匹配到的第一个字符串 1 #ne 2 #two 3 #hree 4 #ffour 5 #fffive [root@localhost app]#sed 's/[a-z]/#/g' test1 #-g 匹配行内全局替换 1 ### 2 #### 3 ##### 4 ###### 5 ####### [root@localhost app]#sed -n 's/[a-z]/#/p' test1 #-p 显示替换成功的行 1 #ne 2 #two 3 #hree 4 #ffour 5 #fffive [root@localhost app]#sed -n 's/[a-z]/#/w /app/test2' test1 #将替换成功的行保存至文件 [root@localhost app]#cat test2 1 #ne 2 #two 3 #hree 4 #ffour 5 #fffive
注意:当匹配模式中含有与分隔符相同的符号时,应当换一种分隔符。总之,避免匹配模式中出现与分隔符相同的符号
比如:
[root@localhost app]#cat test3 123 4/6 7/9 [root@localhost app]#sed '2s///5/' test3 #分隔符与匹配模式相同容易出错 sed: -e expression #1, char 7: unknown option to `s' [root@localhost app]#sed '2s@/@5@' test3 #换一种分隔符 123 456 7/9
高级编辑命令:
学习之前要了解到模式空间和保持空间,除了sed把当前正在处理的行保存在一个临时缓存区中的这个模式空间以外,还有一个保持空间(缓冲区、保留空间),默认为空行
h : 把模式空间中的内容覆盖至保持空间中
H : 把模式空间中的内容追加至保持空间中
g : 从保持空间取出数据覆盖至模式空间
G : 从保持空间取出内容追加至模式空间
x : 把模式空间中的内容与保持空间中的内容进行互换
n : 读取匹配到的行的下一行覆盖至模式空间
N : 读取匹配到的行的下一行追加至模式空间
d : 删除模式空间中的行
D : 删除当前模式空间开端至\n的内容(不再传至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed
通过具体的例子来学习sed高级编辑命令:
[root@localhost app]#sed 'h;G' test1 #先处理h,把匹配到的行(逐行)覆盖到保持空间,然后G,将保持空间的数据追加到模式空间,最后打印显示,这里是默认全部行 1 one 1 one 2 ttwo 2 ttwo 3 three 3 three 4 fffour 4 fffour 5 ffffive 5 ffffive
[root@localhost app]#sed '/one/h;/ttwo/x' test1 #首先处理h,将匹配到的行(one)覆盖至保持空间,然后处理x,将模式空间中匹配到的行(ttwo)与保持空间的数据互换,最后打印显示 1 one 1 one 3 three 4 fffour 5 ffffive
[root@localhost app]#sed 'n;d' test1 #先手处理n,将匹配到的行(逐行)的下一行覆盖至模式空间,然后处理d,将匹配到的模式空间的行删除,最后打印显示 1 one 3 three 5 ffffive
[root@localhost app]#sed 'N;D;d' test1 #先手处理N,将匹配到行(逐行)追加到模式空间,然后处理D,删除模式空间开头至\n换行的数据,并且不执行后面的命令(;d),同时不打印显示并重新循环执行sed直至最后 5 ffffive
文本处理三剑客(grep,sed,awk)单独任何一个都足以写成一本书,此次介绍如有不足之处,敬请批评指出
原创文章,作者:Mozart,如若转载,请注明出处:http://www.178linux.com/85364