sed小总结
添加内容
- 指定行后添加 -a
- [root@localhost luoqi1]# sed '2a luoqi' test.txt
1
2
luoqi
3
4
5 - 指定行前添加 -i
[root@localhost luoqi1]# sed '2a luoqi' test.txt
1
2
luoqi
3
4
5
- 也可以添加多行的内容
[root@localhost luoqi1]# sed '2i luoqi\nLUOQI' test.txt
1
luoqi
LUOQI
2
3
4
5
指定执行的地址范围
sed '以下内容'
10{sed-commands} 对第10行操作
10,20{sed-commands} 对10到20行操作,包括第10,20行
10,+20{sed-commands} 对10到30(10+20)行操作,包括第10,30行
1~2{sed-commands} 对奇数行操作
10,${sed-commands} 对10到最后一行($代表最后一行)操作,包括第10行
/oldboy/{sed-commands} 对匹配oldboy的行操作
/oldboy/,/Alex/{sed-commands} 对匹配oldboy的行到匹配Alex的行操作
/oldboy/,${sed-commands} 对匹配oldboy的行到最后一行操作
/oldboy/,10{sed-commands} 对匹配oldboy的行到第10行操作,注意:如果前10行没有匹配到oldboy,sed软件会显示10行以后的匹配oldboy的行,如果有。
1,/Alex/{sed-commands} 对第1行到匹配Alex的行操作
/oldboy/,+2{sed-commands} 对匹配oldboy的行到其后的2行操作
替换
s:单独使用→将每一行中第一处匹配的字符串进行替换 ==>sed命令
g:每一行进行全部替换 ==>sed命令s的替换标志之一,非sed命令
-i:修改文件内容 ==>sed软件的选项
sed软件替换模型(方框▇被替换成三角▲)
sed -i 's/▇/▲/g' oldboy.log
sed -i 's#▇#▲#g' oldboy.log
拆分替换
echo “I am a good teacher luoqi”。怎么提取good这个单词?
方法一:用awk 直接 awk ‘{print $4}’
方法二:用sed,真J8麻烦
sed ‘s/^.*a \([good].*\) tea.*$/\1/g) ’
解释:^.*a \([a-z].*\) luo.*$
\([a-z].*\) 的意思就是截取 开头是^.*a 和 结尾是tea.*$ 中间的所有字符串
相当于匹配中了 good 这个字符串
sed -r 作用,后面的括号可以不用加转义符,牛逼
sed -r ‘s/^.*a ([good].*) tea.*$/\1/g)
例子2:
[root@luoqi luoqi]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:16:3e:06:4c:5a brd ff:ff:ff:ff:ff:ff
inet 172.17.109.36/20 brd 172.17.111.255 scope global eth0
[root@luoqi luoqi]# ip add | sed -nr 's/^.*d (.*) s.*$/\1/gp'
172.17.111.255
[root@luoqi luoqi]# ip add | sed -nr '6s/^.*d (.*) s.*$/\1/gp'
172.17.111.255
例子3
[root@luoqi luoqi]# tail -1 /etc/passwd
jiange:x:520:28::/home/Asshole/:/bin/bash
把红色字体调换位置
答案
思想:截取黑色未标记的为\1 那么剩下头和尾巴就是\1和\3
[root@luoqi luoqi]# tail -1 /etc/passwd|sed -nr 's#(^.*ge)(.*)(\/bin.*$)#\3\2\1#gp'
/bin/bash:x:520:28::/home/Asshole/:jiange
[root@luoqi luoqi]#
这仅仅是针对某一行!
例子4.
多行如何替换
[root@luoqi luoqi]# tail -3 /etc/passwd
mysql:x:500:500::/home/mysql:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
jiange:x:520:28::/home/Asshole/:/bin/bash
答案:思想一样,都是对:x:520:28::/home/Asshole/:想办法进行分割,\2出来之后\1和\3自然也就出来了
[root@luoqi luoqi]# tail -3 /etc/passwd | sed -nr 's/(^.*)(:x.*:)(\/.*$)/\3\2\1/gp'
/sbin/nologin:x:500:500::/home/mysql:mysql
/sbin/nologin:x:81:81:System message bus:/:dbus
/bin/bash:x:520:28::/home/Asshole/:jiange
查
p 输出指定内容,但默认会输出2次匹配的结果,因此使用n取消默认输出
按行查询
[root@oldboy ~]# sed '2p' person.txt
101,oldboy,CEO
102,zhangyao,CTO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@oldboy ~]# sed -n '2p' person.txt
102,zhangyao,CTO
[root@oldboy ~]# sed -n '2,3p' person.txt
102,zhangyao,CTO
103,Alex,COO
说明:取行就用sed,最简单
[root@oldboy ~]# sed -n '1~2p' person.txt
101,oldboy,CEO
103,Alex,COO
105,feixue,CIO
[root@oldboy ~]# sed -n 'p' person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,yy,COO
104,feixue,CFO
105,dandan,CIO
按字符串查询
[root@oldboy ~]# sed -n '/CTO/p' person.txt
102,zhangyao,CTO
[root@oldboy ~]# sed -n '/CTO/,/CFO/p' person.txt
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
混合查询
[root@oldboy ~]# sed -n '2,/CFO/p' person.txt
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
[root@oldboy ~]# sed -n '/feixue/,2p' person.txt
105,feixue,CIO
#→特殊情况,前两行没有匹配到feixue,就向后匹配,如果匹配到feixue就打印此行
特殊符号
特殊符号&
代表被替换的内容
[root@oldboy ~]# sed '1,3s#C#--&--#g' person.txt #→此处&等于C
101,oldboy,--C--EO #→将1到3行的C替换为--C--
102,zhangyao,--C--TO
103,yy,--C--OO
104,feixue,CFO
105,dandan,CIO
参考文献 https://blog.oldboyedu.com/commands-sed/