这里举一些sed常用的高级用法例子经供参考:
一下操作都针对file.txt文件作修改
[root@QX-××× ~]# cat file.txtlibgcc-4.4.7-4.el6.x86_64setup-2.8.14-20.el6_4.1.noarchtzdata-2013g-1.el6.noarchjakarta-commons-collections-3.2.1-3.4.el6.noarchfilesystem-2.4.30-3.el6.x86_64mesa-dri-filesystem-9.2-0.5.el6.x86_64foomatic-db-filesystem-4.0-7.20091126.el6.noarchxml-common-0.6.3-32.el6.noarch
匹配行后添加字段:
[root@QX-××× ~]# sed 's/noarch$/&.bak/' file.txtlibgcc-4.4.7-4.el6.x86_64setup-2.8.14-20.el6_4.1.noarch.baktzdata-2013g-1.el6.noarch.bakjakarta-commons-collections-3.2.1-3.4.el6.noarch.bakfilesystem-2.4.30-3.el6.x86_64mesa-dri-filesystem-9.2-0.5.el6.x86_64foomatic-db-filesystem-4.0-7.20091126.el6.noarch.bakxml-common-0.6.3-32.el6.noarch.bak
标记字符串链接修改值:\1代替 (file) 拼接SYSTEM替换system
[root@QX-××× ~]# sed -n 's/\(file\)system/\1SYSTEM/gp' file.txtfileSYSTEM-2.4.30-3.el6.x86_64mesa-dri-fileSYSTEM-9.2-0.5.el6.x86_64foomatic-db-fileSYSTEM-4.0-7.20091126.el6.noarch
跨行匹配:
[root@QX-××× ~]# sed -n '/libgcc/,/system/p' file.txtlibgcc-4.4.7-4.el6.x86_64setup-2.8.14-20.el6_4.1.noarchtzdata-2013g-1.el6.noarchjakarta-commons-collections-3.2.1-3.4.el6.noarchfilesystem-2.4.30-3.el6.x86_64
多重-e编辑
[root@QX-××× ~]# sed -e '1,3d' -e 's/common/COMMON/' file.txtjakarta-COMMONs-collections-3.2.1-3.4.el6.noarchfilesystem-2.4.30-3.el6.x86_64mesa-dri-filesystem-9.2-0.5.el6.x86_64foomatic-db-filesystem-4.0-7.20091126.el6.noarchxml-COMMON-0.6.3-32.el6.noarch
r读,w写,a追加下一行,i追加上一行,c替换
[root@QX-××× ~]# cat scc##################### test file #####################[root@QX-××× ~]# sed '/tzdata/r scc' file.txtlibgcc-4.4.7-4.el6.x86_64setup-2.8.14-20.el6_4.1.noarchtzdata-2013g-1.el6.noarch##################### test file #####################jakarta-commons-collections-3.2.1-3.4.el6.noarchfilesystem-2.4.30-3.el6.x86_64mesa-dri-filesystem-9.2-0.5.el6.x86_64foomatic-db-filesystem-4.0-7.20091126.el6.noarchxml-common-0.6.3-32.el6.noarch [root@QX-××× ~]# sed '/tzdata/w scc' file.txtlibgcc-4.4.7-4.el6.x86_64setup-2.8.14-20.el6_4.1.noarchtzdata-2013g-1.el6.noarchjakarta-commons-collections-3.2.1-3.4.el6.noarchfilesystem-2.4.30-3.el6.x86_64mesa-dri-filesystem-9.2-0.5.el6.x86_64foomatic-db-filesystem-4.0-7.20091126.el6.noarchxml-common-0.6.3-32.el6.noarch[root@QX-××× ~]# cat scctzdata-2013g-1.el6.noarch[root@QX-××× ~]# sed '/tzdata/a\ --> 追加在匹配行的下一行' file.txtlibgcc-4.4.7-4.el6.x86_64setup-2.8.14-20.el6_4.1.noarchtzdata-2013g-1.el6.noarch--> 追加在匹配行的下一行jakarta-commons-collections-3.2.1-3.4.el6.noarchfilesystem-2.4.30-3.el6.x86_64mesa-dri-filesystem-9.2-0.5.el6.x86_64foomatic-db-filesystem-4.0-7.20091126.el6.noarchxml-common-0.6.3-32.el6.noarch
n匹配行的下一行,y是转换 (这里的n不是参数,是command)
[root@QX-××× ~]# sed -n '/tzdata/{n;s/common/COMMON/p;}' file.txtjakarta-COMMONs-collections-3.2.1-3.4.el6.noarch[root@QX-××× ~]# sed '1,3y/abcd/ABCD/' file.txtliBgCC-4.4.7-4.el6.x86_64setup-2.8.14-20.el6_4.1.noArChtzDAtA-2013g-1.el6.noArChjakarta-commons-collections-3.2.1-3.4.el6.noarchfilesystem-2.4.30-3.el6.x86_64mesa-dri-filesystem-9.2-0.5.el6.x86_64foomatic-db-filesystem-4.0-7.20091126.el6.noarchxml-common-0.6.3-32.el6.noarch
h 暂存缓存区,g取用
[root@QX-××× ~]# sed -e '/libgcc/h' -e '$g' file.txtlibgcc-4.4.7-4.el6.x86_64setup-2.8.14-20.el6_4.1.noarchtzdata-2013g-1.el6.noarchjakarta-commons-collections-3.2.1-3.4.el6.noarchfilesystem-2.4.30-3.el6.x86_64mesa-dri-filesystem-9.2-0.5.el6.x86_64foomatic-db-filesystem-4.0-7.20091126.el6.noarchlibgcc-4.4.7-4.el6.x86_64
sed脚本:
-
sed脚本就是写在文件中哈的一列sed命令,在命令启动sed命令时,如果想让sed知道这些命令来自文件,就要用-f选项带上sed脚本的文件名,
sed脚本语法:
-
末尾不能有任何多余的空格或文本
如果命令不能独占一行,就必须以分号结尾
sed 续行需要用到反斜杠\
vim read1#my sed script/libgcc/i\this is add lines one\two\three\add end1,3y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/s/common/COMMON/g
结果:
[root@QX-××× ~]# sed -f read1 file.txtLIBGCC-4.4.7-4.EL6.X86_64this is a add linesdsadassthreeSETUP-2.8.14-20.EL6_4.1.NOARCHTZDATA-2013G-1.EL6.NOARCHjakarta-COMMONs-collections-3.2.1-3.4.el6.noarchfilesystem-2.4.30-3.el6.x86_64mesa-dri-filesystem-9.2-0.5.el6.x86_64foomatic-db-filesystem-4.0-7.20091126.el6.noarchxml-COMMON-0.6.3-32.el6.noarch