MENU

Linux 上古神器之 sed

March 17, 2017 • Read: 687 • Linux

1.sed介绍

sed是stream editor(流编辑器)的简称,出生于1973年;不同于vim这类交互式编辑器,它没有编辑界面、快捷键和光标,只通过一次输入的编辑指令来处理输入流并输出结果,因此效率更高;另外,sed还能够过滤文本输出选定行。

sed一次处理一行内容,存储到一个临时缓冲区,即“模式空间”(pattern space),处理完成后输出到标注出,然后sed再获取下一行内容到模式空间处理,直到全部处理完成。

基本语法如下:

sed [OPTION]... {script-only-if-no-other-script} [input-file]...
  • sed是命令
  • [OPTION]是选项,用于指定后面的脚本字段的工作模式
  • {script-only-if-no-other-script}是处理命令
  • [input-file]是输入文件

例如,将文件input.txt中“hello”替换为“world”(并将结果输出到output.txt文件中):

sed 's/hello/world/' input.txt > output.txt

sed用于完成数据行的替换、删除、新增、选取等特定工作是非常好用的,而且效率很高。

2.sed选项

  • -n选项(--quiet, --silent)

    sed默认会处理完成一行,在屏幕输出一行;而-n会闭模式空间的自动打印,使用-n后则只输出经过sed处理的行。

  • -e选项(--expression)

    增加要执行的命令,如果要使用多个命令可以使用-e实现。

  • -i选项(--in-place)

    直接修改原文件内容,默认不输出到屏幕;(如果增加后缀则会备份文件,比如-i.bak);当然也可以像sed 's/hello/world/' input.txt > output.txt这样重定向来保存处理结果。

  • -r选项(--regexp-extended)

    默认sed的匹配模式只能支持基本正则表达式,使用-r在处理命令中使用扩展正则表达式;(通常扩展的正则表达式会少很多反斜杠)。

  • -f选项(--file)

    执行文件内的sed处理命令。

3.sed命令

  • d(delete)

    删除命令,[address]d,可以根据行删除sed '1,5d' ifconfig.txt(删除1-5行),也可以匹配内容删除sed '/HWaddr/d' ifconfig.txt(删除包含HWaddr的行。)

  • a\(append)

    追加命令,在指定行追加一行内容,[address]a\replacement;例如sed '/collisions/a\hello' ifconfig.txt,会在每个包含collisions的行追加一行hello。

  • i\(insert)

    插入命令,在指定行前插入一行内容,[address]i\replacement

  • c\(change)

    修改命令,使用replacement替换指定行,[address]c\replacement

  • s(substitute)

    替换命令,不同于c命令,s命令是替换指定文本而不是行[address]s/pattern/replacement/flag,其中pattern是匹配的内容(可以是正则表达式);replacement是替换内容;flag可以使用n、g、p、w。

    • n:替换前n个匹配的内容
    • g:全局替换
    • p:只输出匹配替换的行
    • w:当行匹配时,把模式空间的内容输出到文件中
  • =

    输出当前行号,[address]=

  • y

    替换命令,在匹配行上将source包含的内容替换成dest包含的内容,[address]y/source/dest/;例如sed 2,4y/abc/123将把2到5行中,a替换成1、b替换成2、c替换成3。

  • q(quit)

    退出命令,sed读取到指定行之后就退出,并将处理结果输出,[address]q

说明:[address]表示要处理的行,可以是行号、正则表达式、特定行中的部分文本片段;

4.sed例子

文本内容:

Twinkle, twinkle, littlestar,
How I wonder what you are!
Up above the world so high,
Like a diamond in the sky.
When the blazing sun is gone, 
When he nothing shines upon, 
Then you show your little light, 
Twinkle, twinkle, all the night. 
  1. sed '2,5d' demo.txt

    删除2到5行

       
      Twinkle, twinkle, littlestar,
      When he nothing shines upon,
      Then you show your little light,
      Twinkle, twinkle, all the night.
          
  2. sed '2,$d' demo.txt

    删除第2行到最后一行($表示最后一行)

         
      Twinkle, twinkle, littlestar,
      
  3. sed '/twinkle/d' demo.txt

    删除包含twinkle的行

        
      How I wonder what you are!
      Up above the world so high,
      Like a diamond in the sky.
      When the blazing sun is gone,
      When he nothing shines upon,
      Then you show your little light,
    
  4. sed '/l.*l/d' demo.txt

    删除正则匹配l.*l的行

         
      How I wonder what you are!
      Up above the world so high,
      Like a diamond in the sky.
      When the blazing sun is gone,
      When he nothing shines upon,
    
  5. sed '4a\--------' demo.txt

    在第四行后,追加一行“--------”

        
      Twinkle, twinkle, littlestar,
      How I wonder what you are!
      Up above the world so high,
      Like a diamond in the sky.
      --------
      When the blazing sun is gone,
      When he nothing shines upon,
      Then you show your little light,
      Twinkle, twinkle, all the night.
      
  6. sed '$a\--------' demo.txt

    在最后一行追加一行“--------”

         
      Twinkle, twinkle, littlestar,
      How I wonder what you are!
      Up above the world so high,
      Like a diamond in the sky.
      When the blazing sun is gone,
      When he nothing shines upon,
      Then you show your little light,
      Twinkle, twinkle, all the night.
      --------     
    
  7. sed '2,3i\????????' demo.txt

    在2到3行之前插入“????????”

         
      Twinkle, twinkle, littlestar,
      ????????
      How I wonder what you are!
      ????????
      Up above the world so high,
      Like a diamond in the sky.
      When the blazing sun is gone,
      When he nothing shines upon,
      Then you show your little light,
      Twinkle, twinkle, all the night.
      
  8. sed '3,$c\Hello world' demo.text

    将3到最后一行的内容替换为“Hello world”

      
      Twinkle, twinkle, littlestar,
      How I wonder what you are!
      Hello world
    
  9. sed 's/When/XXX/' demo.txt

    将每行的When替换为XXX

        
      Twinkle, twinkle, littlestar,
      How I wonder what you are!
      Up above the world so high,
      Like a diamond in the sky.
      XXX the blazing sun is gone,
      XXX he nothing shines upon,
      Then you show your little light,
      Twinkle, twinkle, all the night. 
      
  10. sed 's/winkle/XXX/' demo.txt

    将winkle替换为XXX,注意此时行内只会匹配第一个,twinkle没有被替换

        
      TXXX, twinkle, littlestar,
      How I wonder what you are!
      Up above the world so high,
      Like a diamond in the sky.
      When the blazing sun is gone,
      When he nothing shines upon,
      Then you show your little light,
      TXXX, twinkle, all the night. 
         
  11. sed 's/winkle/XXX/g' demo.txt

    将匹配到的winkle全部替换,g表示行内全部替换

        
      TXXX, tXXX, littlestar,
      How I wonder what you are!
      Up above the world so high,
      Like a diamond in the sky.
      When the blazing sun is gone,
      When he nothing shines upon,
      Then you show your little light,
      TXXX, tXXX, all the night. 
      
  12. sed -n 's/winkle/XXX/gp' demo.txt

    -n只输出经过sed处理的行

        
      TXXX, tXXX, littlestar,
      TXXX, tXXX, all the night. 
    
  13. sed -e '4,$d' -e 's/winkle/XXX/g' demo.txt

    -e表示拼接多个命令,先执行“4到最后一行的删除”,接着执行“winkle替换为XXX”

        
      TXXX, tXXX, littlestar,
      How I wonder what you are!
      Up above the world so high, 
    
  14. sed 'y/abcd/ABCD/' demo.txt

    将匹配行的a替换为A,b替换为B,依次类推;不同于s的整体替换,y替换的是单个字母

        
      Twinkle, twinkle, littlestAr,
      How I wonDer whAt you Are!
      Up ABove the worlD so high,
      Like A DiAmonD in the sky.
      When the BlAzing sun is gone,
      When he nothing shines upon,
      Then you show your little light,
      Twinkle, twinkle, All the night.
Last Modified: July 21, 2019