一、sed基本简介
sed是每次读取文件一行内容到一个缓冲区中(模式空间)进行处理,这个处理是指依次调用script中的命令对模式空间中的内容处理。注意是对模式空间的内容进行处理而非原文件,如需对原文件,则需使用选项。
二、用法
sed基本用法及选项:
sed的基本用法: sed- stream editor for filtering and transforming text sed [OPTION]...{script-only-if-no-other-script} [input-file]... sed ‘AddressCommand’ file 常用选项: -i:直接修改原文件 -r:表示使用扩展正则表达式 -n∶静默模式,使用安静(silent)模式。在一般sed的用法中,所有来自stdin一般都会输出到屏幕上。 但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。 -e∶直接在指令列模式上进行 sed 的动作编辑; -f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作; Address #指定对那些文本进行处理 1、StartLine,EndLine 比如1,100 表示从第一行到100行 $:最后一行 如果是$的话,$与后面的命令应该有一个空格,如果是数字的话则不必 2、/RegExp/ 还可以使用正则表达式匹配要处理的行 /^root/ 3、/pattern1/,/pattern2/ 第一次被pattern1匹配到的行开始,至第一次被pattern2匹配到的行结束,这中间的所有行 4、LineNumber 比如 sed -n '1p' filename #显示第1行 5、StartLine, +N 从startLine开始,向后的N行; COMMAND:Command #对上面Address指定的文本行进行相应的处理 d:删除指定的行 p:打印 a \string:在指定的行后面追加新行,内容为string i \string:在指定的行前面添加新的行,内容为string r FILE:将指定的文件的内容添加至符合条件的行处 w FIEL:将地址指定的范围内的行另存之指定的文件中 s/pattern/string/修饰符:查找并替换 加修饰符:g:全局替换,i:忽略大小写 例如 sed 's/hello/hi/gi' 1.txt 表示将1.txt 中所有的hello或者HELLO或者Hello...统统替换成hello s///: s###, s@@@ #注意不一定非得使用/// 也可以使用### @@@ \(\), \1, \2 注意:()一定要进行转义 #可以像正则表达式那样使用反向引用。
上诉实例:
[root@centos7 ~]# cat -n fstab 1# /etc/fstab 2# Created by anaconda on Tue Jul 19 14:39:24 2016 3# Accessible filesystems, by reference, are maintained under '/dev/disk' 4# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info 5# 6UUID=f83c52ce-5740-4f02-bb87-6e190360dc30 / xfs defaults 0 0 7UUID=c98144e4-d1b4-45b1-bb22-3112420ea487 /boot xfs defaults 0 0 8UUID=dbf5c483-133e-4888-bbb1-a9622d83a930 swap swap defaults 0 0 9#END [root@centos7 ~]# sed '1,6d' fstab UUID=c98144e4-d1b4-45b1-bb22-3112420ea487 /boot xfs defaults 0 0 UUID=dbf5c483-133e-4888-bbb1-a9622d83a930 swap swap defaults 0 0 #END [root@centos7 ~]# sed -n '1,2p' fstab # /etc/fstab # Created by anaconda on Tue Jul 19 14:39:24 2016 [root@centos7 ~]# [root@centos7 ~]# sed '/^UUID/a \@@@love linux' fstab #a \string 附加内容到匹配的行 # /etc/fstab # Created by anaconda on Tue Jul 19 14:39:24 2016 # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=f83c52ce-5740-4f02-bb87-6e190360dc30 / xfs defaults 0 0 @@@love linux UUID=c98144e4-d1b4-45b1-bb22-3112420ea487 /boot xfs defaults 0 0 @@@love linux UUID=dbf5c483-133e-4888-bbb1-a9622d83a930 swap swap defaults 0 0 @@@love linux #END [root@centos7 ~]# [root@centos7 ~]# sed '/^UUID/i \@@@love linux' fstab #指定的行前 # /etc/fstab # Created by anaconda on Tue Jul 19 14:39:24 2016 # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # @@@love linux UUID=f83c52ce-5740-4f02-bb87-6e190360dc30 / xfs defaults 0 0 @@@love linux UUID=c98144e4-d1b4-45b1-bb22-3112420ea487 /boot xfs defaults 0 0 @@@love linux UUID=dbf5c483-133e-4888-bbb1-a9622d83a930 swap swap defaults 0 0 #END [root@centos7 ~]# [root@centos7 ~]# sed -n '/oot/w /tmp/oot.out' fstab [root@centos7 ~]# cat /tmp/oot.out UUID=c98144e4-d1b4-45b1-bb22-3112420ea487 /boot xfs defaults 0 0 [root@centos7 ~]# [root@centos7 ~]# sed -i 's#boot#Boot#g' fstab [root@centos7 ~]# grep -i "boot" fstab UUID=c98144e4-d1b4-45b1-bb22-3112420ea487 /Boot xfs defaults 0 0 [root@centos7 ~]# [root@centos7 ~]# cat sed.txt hello, like hi,my love [root@centos7 ~]# sed 's/l..e/&r/g' sed.txt hello, liker hi,my lover [root@centos7 ~]# [root@centos7 ~]# sed 's/\(l..e\)/\1r/g' sed.txt hello, liker hi,my lover [root@centos7 ~]#
三、练习巩固知识
1、删除/etc/init.d/functions文件中行首的空白符; [root@centos7 ~]# sed -r 's#^[[:space:]]+##g' /etc/init.d/functions 2、替换/etc/inittab文件中"id:3:initdefault:"一行中的数字为5; [root@centos6 ~]# sed 's#id:3:initdefault:#id:5:initdefault:#g' /etc/inittab 3、删除/etc/inittab文件中的空白行; [root@centos6 ~]# sed -i '/^$/d' /etc/inittab 4、删除/etc/inittab文件中开头的#号; [root@centos6 ~]# sed 's/^#//g' /etc/inittab 5、删除某文件中开头的#号及后面的空白字符,但要求#号后面必须有空白字符; [root@centos6 ~]# sed -r 's@^#[[:space:]]?@@g' /etc/inittab 6、删除某文件中以空白字符后面跟#类的行中的开头的空白字符及# [root@centos6 ~]# sed -r 's/^[[:space:]]+#+//g' /etc/inittab
转载于:https://blog.51cto.com/purify/1835389