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 '以下内容'

  1. 10{sed-commands} 对第10行操作
  2. 10,20{sed-commands} 对10到20行操作,包括第10,20行
  3. 10,+20{sed-commands} 对10到30(10+20)行操作,包括第10,30行
  4. 1~2{sed-commands} 对奇数行操作
  5. 10,${sed-commands} 对10到最后一行($代表最后一行)操作,包括第10行
  6. /oldboy/{sed-commands} 对匹配oldboy的行操作
  7. /oldboy/,/Alex/{sed-commands} 对匹配oldboy的行到匹配Alex的行操作
  8. /oldboy/,${sed-commands} 对匹配oldboy的行到最后一行操作
  9. /oldboy/,10{sed-commands} 对匹配oldboy的行到第10行操作,注意:如果前10行没有匹配到oldboy,sed软件会显示10行以后的匹配oldboy的行,如果有。
  10. 1,/Alex/{sed-commands} 对第1行到匹配Alex的行操作
  11. /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取消默认输出

         按行查询
  1. [root@oldboy ~]# sed '2p' person.txt
  2. 101,oldboy,CEO
  3. 102,zhangyao,CTO
  4. 102,zhangyao,CTO
  5. 103,Alex,COO
  6. 104,yy,CFO
  7. 105,feixue,CIO
  8. [root@oldboy ~]# sed -n '2p' person.txt
  9. 102,zhangyao,CTO
  10. [root@oldboy ~]# sed -n '2,3p' person.txt
  11. 102,zhangyao,CTO
  12. 103,Alex,COO
  13. 说明:取行就用sed,最简单
  14. [root@oldboy ~]# sed -n '1~2p' person.txt
  15. 101,oldboy,CEO
  16. 103,Alex,COO
  17. 105,feixue,CIO
  18. [root@oldboy ~]# sed -n 'p' person.txt
  19. 101,oldboy,CEO
  20. 102,zhangyao,CTO
  21. 103,yy,COO
  22. 104,feixue,CFO
  23. 105,dandan,CIO
         按字符串查询
  1. [root@oldboy ~]# sed -n '/CTO/p' person.txt
  2. 102,zhangyao,CTO
  3. [root@oldboy ~]# sed -n '/CTO/,/CFO/p' person.txt
  4. 102,zhangyao,CTO
  5. 103,Alex,COO
  6. 104,yy,CFO
          混合查询
  1. [root@oldboy ~]# sed -n '2,/CFO/p' person.txt
  2. 102,zhangyao,CTO
  3. 103,Alex,COO
  4. 104,yy,CFO
  5. [root@oldboy ~]# sed -n '/feixue/,2p' person.txt
  6. 105,feixue,CIO
  7. #→特殊情况,前两行没有匹配到feixue,就向后匹配,如果匹配到feixue就打印此行

特殊符号

 特殊符号&代表被替换的内容
  1. [root@oldboy ~]# sed '1,3s#C#--&--#g' person.txt #→此处&等于C
  2. 101,oldboy,--C--EO #→将1到3行的C替换为--C--
  3. 102,zhangyao,--C--TO
  4. 103,yy,--C--OO
  5. 104,feixue,CFO
  6. 105,dandan,CIO

参考文献 https://blog.oldboyedu.com/commands-sed/

猜你喜欢

转载自www.cnblogs.com/luoqi302331/p/10366667.html
sed