shell三剑客之sed-06
学习sed的关键是要搞清楚,它是一个流==编辑器==,编辑器常见的功能有:
删除行
打印行
增加行
替换(修改)
sed参数
-e 进行多项编辑,即对输入行应用多条sed命令时使用
-n 取消默认的输出
-r 使用扩展正则表达式
-i inplace,原地编辑(修改源文件)
sed操作
d 删除行
p 打印行
a 后面加行
i 前面加行
s 替换修改
#示例演练,指定删除第2行 # head -5 /etc/passwd |cat -n |sed 2d 变量引用需要双引号 a=2 head -5 /etc/passwd |cat -n |sed "$a"d 删除第2行到第3行,中间的逗号表示范围 head -5 /etc/passwd |cat -n |sed 2,3d 删除第1行和第5行,中间为分号,表示单独的操作 head -5 /etc/passwd |cat -n |sed '1d;5d' 删除第1,2,4行, -e参数是把不同的多种操作可以衔接起来 head -5 /etc/passwd |cat -n |sed -e '2d;4d' -e '1d' 删除正则匹配到的行 head -n 5 /etc/passwd |cat -n |sed '/oo/d' 删除以root开头的行 head -n 5 /etc/passwd |sed '/^root/d' 删除以bash结尾的行 head -n 5 /etc/passwd |sed '/bash$/d' #使用i直接操作源文件修改,建议先不加参数进行修改,修改完没问题后,再加i参数进行源文件进行修改 #`sed -i`删除/etc/vsftpd/vsftpd.conf里所有的注释和空行 sed -i '/^#/d;/^$/d' /etc/vsftpd/vsftpd.conf `sed -i`删除/etc/samba/smb.conf里所有的注释和空行 sed -i '/#/d;/;/d;/^$/d;/^\t$/d' /etc/samba/smb.conf #打印行操作,打印第一行 head -5 /etc/passwd |cat -n | sed 1p 1 root:x:0:0:root:/root:/bin/bash # 会在原来5行的基础上再打印第1行 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin head -5 /etc/passwd |cat -n | sed -n 1p # 正确做法加一个-n参数 1 root:x:0:0:root:/root:/bin/bash 打印第一行和第四行 head -5 /etc/passwd |sed -ne '1p;4p' 打印~4行 head -5 /etc/passwd |sed -ne '1,4p' 打印正则匹配到的行,打印有root关键字的行 head -5 /etc/passwd |sed -n '/root/p' #增加行操作 sed -i '2a33333' 1.txt #在文本1.txt文本第2行后增加33333这一行,其中2a代表插入到第二行后 ,如果第一行插入请把2a改成li 也可以使用正则匹配到的行后面增加一行。 sed -i '/^4/accccc' 1.txt #表示在4开头的行的后一行加上ccccc这一行 #修改替换操作 替换每行里的第1个匹配字符 head -5 /etc/passwd |sed 's/:/===/' #如果要替换每一行所有匹配的,请后面加g head -5 /etc/passwd |sed 's/:/===/g' root===x:0:0:root:/root:/bin/bash bin===x:1:1:bin:/bin:/sbin/nologin daemon===x:2:2:daemon:/sbin:/sbin/nologin adm===x:3:4:adm:/var/adm:/sbin/nologin lp===x:4:7:lp:/var/spool/lpd:/sbin/nologin 替换2~4行 head -5 /etc/passwd |sed '2,4s/:/===/g' 替换2行和4行 head -5 /etc/passwd |sed '2s/:/===/g;4s/:/===/g' 注意后面的数字是2,前面替换了1个,剩下的里面替换第2个也就是原来的第3个 head -5 /etc/passwd |sed '2s/:/===/;2s/:/===/2' root:x:0:0:root:/root:/bin/bash bin===x:1===1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin #使用正则匹配替换 替换以daemon开头的那一行 head -5 /etc/passwd |sed '/^daemon/s/:/===/g' root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon===x===2===2===daemon===/sbin===/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin