Linux 三剑客之 sed 命令

1、概述

sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

 

2、命令格式

sed[OPTION]... {script-only-if-no-other-script} [input-file]...

或者可以理解为:sed  [options]  'AddressCommand'  file ...

 

0、全局数据

  1. [oldboy@oldboy awktest]$ cat 01test       
  2. 01  
  3. 02  
  4. 03  
  5. 04  
  6. 05  
  7. 06  
  8. 07  
  9. 08  
  10. 09  
  11. 10  

1、Address:匹配地址

1、number 只匹配指定的行
  1. [oldboy@oldboy awktest]$ sed -n '4p' 01test   
  2. 04  
2、first~step  从first开始,每次步长为step

       first可以为0

  1. [oldboy@oldboy awktest]$ sed -n '2~3p' 01test   #从第二行开始,每次步长为3  
  2. 02  
  3. 05  
  4. 08  
2、StartLine,EndLine 开始行到结束行

       比如1,100     其中startLine最小为1不能为0

       $:最后一行

  1. [oldboy@oldboy awktest]$ sed -n '4,6p' 01test   # 46行  
  2. 04  
  3. 05  
  4. 06  
  5. [oldboy@oldboy awktest]$ sed -n '4,$p' 01test   # 4到最后一行  $表示最后一行  
  6. 04  
  7. 05  
  8. 06  
  9. 07  
  10. 08  
  11. 09  
  12. 10  
  13. [oldboy@oldboy awktest]$ sed -n '0,$p' 01test       # 不能从0开始  
  14. sed: -e expression #1char 4: invalid usage of line address 0  
3、/RegExp/或者\cregexpc 正则匹配

       注意:\cregexpcThe c may be any character

  1. [root@oldboy ~]# sed -n '/root/p' /etc/passwd        
  2. root:x:0:0:root:/root:/bin/bash  
  3. operator:x:11:0:operator:/root:/sbin/nologin  
  4. [root@oldboy ~]# sed -n '/^root/p' /etc/passwd      # 匹配以root开头的行  
  5. root:x:0:0:root:/root:/bin/bash  
  6. [root@oldboy ~]# sed -n '/sync$/p' /etc/passwd      # 匹配以sync结尾的行  
  7. sync:x:5:0:sync:/sbin:/bin/sync  

  1. [root@oldboy ~]# sed -n '\@root@p' /etc/passwd    
  2. root:x:0:0:root:/root:/bin/bash  
  3. operator:x:11:0:operator:/root:/sbin/nologin  
  4. [root@oldboy ~]# sed -n '\@^root@p' /etc/passwd    
  5. root:x:0:0:root:/root:/bin/bash  
  6. [root@oldboy ~]# sed -n '\@sync$@p' /etc/passwd    
  7. sync:x:5:0:sync:/sbin:/bin/sync  

       请认真区分上面两者的区别。

4、addr1,+N  从addr1开始,并且继续匹配下面的N行
  1. [oldboy@oldboy awktest]$ sed -n '2,+3p' 01test    
  2. 02  
  3. 03  
  4. 04  
  5. 05  

2、Command:命令操作

Zero- or One- address commands  建议只给一个地址信息,而不是地址范围
1、=  打印当前的行   sed-n '7,${=;p}' 01test | sed -n '/^[0-9]*$/{N;s/\n/: /p}'
  1. [oldboy@oldboy awktest]$ sed -n '7,$=' 01test       
  2. 7  
  3. 8  
  4. 9  
  5. 10  
  6. [oldboy@oldboy awktest]$ sed -n '7,$ {=;p}' 01test    
  7. 7  
  8. 07  
  9. 8  
  10. 08  
  11. 9  
  12. 09  
  13. 10  
  14. 10   
  15. [oldboy@oldboy awktest]$ sed -n '7,${=;p}' 01test | sed -n '/^[0-9]*$/{N;s/\n/: /p}'      
  16. 707  
  17. 808  
  18. 909  
  19. 1010  

2、a \string    在指定的行后面追加新行,内容为string  【\n:可以用于换行
  1. [oldboy@oldboy awktest]$ sed '6,8a \I love\nbingxing' 01test    # \n 可用于换行  
  2. 01  
  3. 02  
  4. 03  
  5. 04  
  6. 05  
  7. 06  
  8. I love  
  9. bingxing  
  10. 07  
  11. I love  
  12. bingxing  
  13. 08  
  14. I love  
  15. bingxing  
  16. 09  
  17. 10  

3、i \string    在指定的行前面插入新行,内容为string  【\n:可以用于换行
  1. [oldboy@oldboy awktest]$ sed '6,8i \I love\nbingxing' 01test    
  2. 01  
  3. 02  
  4. 03  
  5. 04  
  6. 05  
  7. I love  
  8. bingxing  
  9. 06  
  10. I love  
  11. bingxing  
  12. 07  
  13. I love  
  14. bingxing  
  15. 08  
  16. 09  
  17. 10  

4、q [exit-code] 和Q [exit-code]

       注意下面的区别:

  1. [oldboy@oldboy awktest]$ sed '4q' 01test    # 到第4行退出  
  2. 01  
  3. 02  
  4. 03  
  5. 04  
  6. [oldboy@oldboy awktest]$ sed '4,6q' 01test   # 只接受一个地址信息  
  7. sed: -e expression #1char 4: command only uses one address  
  8. [oldboy@oldboy awktest]$ sed '4Q' 01test    # 到第4行的前一行退出  
  9. 01  
  10. 02  
  11. 03  
  12. [oldboy@oldboy awktest]$ sed '4,5Q' 01test  # 只接受一个地址信息  
  13. sed: -e expression #1char 4: command only uses one address   

5、r filename  从filename读取并追加文件
  1. [oldboy@oldboy awktest]$ cat test   
  2. zhanglaing  
  3. bingxing  
  4. [oldboy@oldboy awktest]$ sed '3,5r test' 01test  # 在匹配的地方追加信息  
  5. 01  
  6. 02  
  7. 03  
  8. zhanglaing  
  9. bingxing  
  10. 04  
  11. zhanglaing  
  12. bingxing  
  13. 05  
  14. zhanglaing  
  15. bingxing  
  16. 06  
  17. 07  
  18. 08  
  19. 09  
  20. 10  

6、R filename  从filename追加文本信息,每次追加一行
  1. [oldboy@oldboy awktest]$ cat test   
  2. zhanglaing  
  3. bingxing  
  4. [oldboy@oldboy awktest]$ sed '3,5R test' 01test     # 每n次匹配,追加test文件的第n行信息  
  5. 01  
  6. 02  
  7. 03  
  8. zhanglaing      # 第一次,追加第一行  
  9. 04  
  10. bingxing        # 第二次,追加第二行  
  11. 05  
  12. 06  
  13. 07  
  14. 08  
  15. 09  
  16. 10  

Commands which accept address ranges  直接地址范围
1、c \string    替换匹配的行,内容为string  【\n:可以用于换行
  1. [oldboy@oldboy awktest]$ sed '3,5c \zhang\nliang' 01test    # 35行被替换  
  2. 01  
  3. 02  
  4. zhang  
  5. liang  
  6. 06  
  7. 07  
  8. 08  
  9. 09  
  10. 10  

2、d  删除模式空间内容,开始下次循环
  1. [oldboy@oldboy awktest]$ sed '3,5d' 01test   # 35行被删除  
  2. 01  
  3. 02  
  4. 06  
  5. 07  
  6. 08  
  7. 09  
  8. 10  

3、l  列出当前行的所有信息                【小写的L】
  1. [oldboy@oldboy awktest]$ sed -n '3,5l' 01test   
  2. 03$  
  3. 04$  
  4. 05$  

4、l width  列出当前行的所有信息,宽度为 width 
  1. [oldboy@oldboy awktest]$ sed -n '3,5l 2' 01test    
  2. 0\  
  3. 3$  
  4. 0\  
  5. 4$  
  6. 0\  
  7. 5$  

5、p  打印当前的模式空间
  1. [oldboy@oldboy awktest]$ sed -n '2,5p' 01test   
  2. 02  
  3. 03  
  4. 04  
  5. 05  

6、s/regexp/replacement/  也可以为 s@@@   s###

默认只替换每行中第一次被模式匹配到的字符串  【前面是正则,后面是字符串

加修饰符

        g: 全局替换            s/pattern/string/g【修饰符】

        i: 忽略字符大小写      s/pattern/string/i【修饰符】

s///: s###, s@@@  效果一样    【\(\), \1, \2  分组】【&  引用模式匹配整个串, regexp部分

示例1
  1. [oldboy@moban ~]$ cat /etc/fstab   
  2. UUID=67be2fce-cfc2-4e9e-ae0f-47d70d2d4bad /boot                   ext4    defaults        1 2  
  3. tmpfs                   /dev/shm                tmpfs   defaults        0 0  
  4. devpts                  /dev/pts                devpts  gid=5,mode=620  0 0  
  5. [oldboy@moban ~]$ sed 's@/@##@' /etc/fstab      # 只匹配匹配行第一次出现时,不是全局匹配  
  6. UUID=67be2fce-cfc2-4e9e-ae0f-47d70d2d4bad ##boot                   ext4    defaults        1 2  
  7. tmpfs                   ##dev/shm                tmpfs   defaults        0 0  
  8. devpts                  ##dev/pts                devpts  gid=5,mode=620  0 0  
  9. [oldboy@moban ~]$ sed 's@/@##@g' /etc/fstab   
  10. UUID=67be2fce-cfc2-4e9e-ae0f-47d70d2d4bad ##boot                   ext4    defaults        1 2  
  11. tmpfs                   ##dev##shm                tmpfs   defaults        0 0  
  12. devpts                  ##dev##pts                devpts  gid=5,mode=620  0 0  
  13. [oldboy@moban ~]$   
  14. [oldboy@moban ~]$ sed 's@u@##@g' /etc/fstab    
  15. UUID=67be2fce-cfc2-4e9e-ae0f-47d70d2d4bad /boot                   ext4    defa##lts        1 2  
  16. tmpfs                   /dev/shm                tmpfs   defa##lts        0 0  
  17. devpts                  /dev/pts                devpts  gid=5,mode=620  0 0  
  18. [oldboy@moban ~]$ sed 's@u@##@gi' /etc/fstab    # i 忽略大小写  
  19. ####ID=67be2fce-cfc2-4e9e-ae0f-47d70d2d4bad /boot                   ext4    defa##lts        1 2  
  20. tmpfs                   /dev/shm                tmpfs   defa##lts        0 0  
  21. devpts                  /dev/pts                devpts  gid=5,mode=620  0 0  

示例2

l..e:  like-->liker

       love-->lover

                             

       like-->Like

       love-->Love

  1. [oldboy@moban sed]$ cat sed2  
  2. hello, like  
  3. hi, my love  
  4. [oldboy@moban sed]$ sed 's/l..e/l..er/' sed2  
  5. hello, l..er  
  6. hi, my l..er  
  7. [oldboy@moban sed]$ sed 's/l..e/&r/' sed2      # 使用了 &  
  8. hello, liker  
  9. hi, my lover  
  10. [oldboy@moban sed]$ sed 's/\(l..e\)/\1r/' sed2    # 使用了向后引用 或者扩展正则: sed -r 's/(l..e)/\1r/' sed2  
  11. hello, liker  
  12. hi, my lover  

7、w filename  将模式空间匹配的内容,写到filename  中
  1. [oldboy@oldboy awktest]$ sed -n '3,6w test01' 01test   
  2. [oldboy@oldboy awktest]$ cat test01  
  3. 03  
  4. 04  
  5. 05  
  6. 06  

3、常用命令选项

       -n, --quiet, --silent  抑制模式空间的自动打印

  1. [oldboy@oldboy awktest]$ sed '3,6p' 01test    
  2. 01  
  3. 02  
  4. 03  
  5. 03  
  6. 04  
  7. 04  
  8. 05  
  9. 05  
  10. 06  
  11. 06  
  12. 07  
  13. 08  
  14. 09  
  15. 10  
  16. [oldboy@oldboy awktest]$ sed -n '3,6p' 01test   
  17. 03  
  18. 04  
  19. 05  
  20. 06  

    -e script,--expression=script   将脚本添加到要执行的命令。允许多点编辑

  1. [oldboy@moban sed]$ cat sed1   
  2. qwewq  
  3. wetwdgh  
  4. 5555  
  5. zhang liang  
  6. werwet bbb  
  7. ewtew 123  
  8. ettte  
  9. [oldboy@moban sed]$ sed -e '1,3d' sed1   
  10. zhang liang  
  11. werwet bbb  
  12. ewtew 123  
  13. ettte  
  14. [oldboy@moban sed]$ sed -e '1,3d' -e 's/zhang/bing/' sed1 # 第一个是删除13行,第二个是将'zhang'替换为'bing'  
  15. bing liang  
  16. werwet bbb  
  17. ewtew 123  
  18. ettte  

    -f script-file, --file=script-file    添加脚本文件内容到将要执行的命令。示例如下


  1. [oldboy@moban sed]$ cat script1    # 没有引号  
  2. 1,3d            # 删除13行  
  3. s/zhang/bing/   # 每行中把 zhang 替换为 bing  
  4. /liang/p          
  5. [oldboy@moban sed]$ cat sed1   
  6. qwewq  
  7. wetwdgh  
  8. 5555  
  9. zhang liang  
  10. werwet bbb  
  11. ewtew 123  
  12. ettte  
  13. [oldboy@moban sed]$ sed -f ./script1 sed1     
  14. bing liang  
  15. bing liang  
  16. werwet bbb  
  17. ewtew 123  
  18. ettte  
  19. [oldboy@oldboy awktest]$ sed -n -f script1 sed1       
  20. bing liang  

    -i[SUFFIX],--in-place[=SUFFIX]  直接修改读取的档案内容,而不是由屏幕输出。

  1. [oldboy@oldboy awktest]$ cat sed2  
  2. zhang liang  
  3. werwet bbb  
  4. [oldboy@oldboy awktest]$ sed -i 's#bbb#bingxing#g' sed2  
  5. [oldboy@oldboy awktest]$ cat sed2  
  6. zhang liang  
  7. werwet bingxing  

       --posix    禁用所有的GNU扩展。

       -r, --regexp-extended    在脚本中使用扩展正则表达式。

 

4、常用示例

       暂无

       请参见另一篇博文

 

5、命令所在位置和类型

  1. [root@oldboy ~]# which sed  
  2. /bin/sed  
  3. [root@oldboy ~]# type sed  
  4. sed is /bin/sed  

6、另请参见

1、Linuxsed 命令

2、三剑客之SED行天下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值