• sed编辑器称为流编辑器(stream editor)。流编辑器将根据在编辑器处理数据之前事先提供的规则集编辑数据流。
  • 由于是按顺序逐行应用命令,所以sed编辑器进行编辑仅需浏览数据流一次。这使得sed编辑器比交互式编辑器要快很多,因而可以动态地快速修改文件中的数据。
  • sed的命令格式:sed options script file
  • sed的options选项:
选项描述
-e script将脚本中指定的命令添加到处理输入时执行的命令中
-f file将文件中指定的命令添加到处理输入时执行的命令中
-n不需要为每个命令产生输出,但要等待打印命令
  • sed编辑器并不修改文本文件中的数据。它只是将修改后的文本发送到STDOUT。
  1. 在命令行中定义编辑器命令:echo "This is a test" | sed 's/test/big test/'
  2. 在命令行中使用多个编辑器命令:(使用-e选项)sed -e 's/brown/green/;s/dog/cat/'
  3. 从文件读取编辑器命令:
1
2
3
4
5
$cat script
/brown/green/
/fox/elephant/
/dog/cat/
$sed -f script data
  • sed编辑器基础知识

    1. 替换命令;s/pattern/replacement/flagsflags可用的替换标记有4种:

      • 数字:表示新文本替换的模式
      • g:表示用新文本替换现有文本的全部实例
      • p:表示打印原始行的内容,会打印包含替换命令中匹配模式的那一行。
      • w file:将替换的结果写入文件
    2. 替换字符:正斜杠要用作字符串定界符,所以若果正斜杠出现再模式文本中,必须使用反斜杠使其转义。sed可以使用**!**感叹号作为字符串定界符。

    3. 使用地址(单一行号、文本模式或者行号或文本模式范围):行寻址,两种行寻址形式:

      • 行的数值范围
      • 筛选行的文本模式 格式:[address]command 或者:(sed组合命令用大括号括起来)
      1
      2
      3
      4
      5
      
      address {
      command1
      command2
      command3
      }
      

    使用文本模式筛选器的命令格式:/pattern/command,必须使用正斜杠标记指定的pattern。sed编辑器仅将该命令应用与包含指定文本模式的行。e.g:sed 'rich/s/bash/csh/' /etc/passwd #为永固更改默认的shell

    1. 删除命令
      1
      2
      3
      4
      5
      6
      
      sed 'd' file #删除file里全部文本
      sed '3d' file #删除file里前3行
      sed '2,3d' file #删除2到3行
      sed '3,$d' file #删除从第3行到末尾
      sed '/number 1/d' file #匹配模式删除命令
      sed '/1/,/3/d' file #文本模式删除若干行,但这样做时要小心。指定的第一个模式将“打开”行删除,而第二个模式将“关闭”行删除。sed将删除指定的这两行命令。必须注意匹配的开始和结束模式。
      

      sed编辑器不会处理原始文件。所删除的所有文本行仅从sed编辑器输出中删除。原始文件仍然包含这些“已删除的”行。

    2. 插入和附加文本:
      • 插入命令(i)在指定行之前添加新的一行;
      • 附加命令(a)在指定行之后添加新的一行。

    命令格式:

    1
    2
    
    sed '[address]command\
    new line'
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    (1)echo "testing" | sed ' i \
    > This is a test '
    (2)sed ' 3i\
    > This is a test. '#在数据流的第三行之前插入新的一行。
    (3)sed ' $i\
    > This is a test. '#在数据流的最后一行之前插入新的一行。
    (4)sed ' 3i\
    > This is a test. \
    > This is another test. '#添加多行文本必须在每一新文本行之前使用一个反斜杠,知道到达要插入或附加文本的最后一行。