禅道博客

分享专业技术知识,文章内容干货满满

《Linux命令行与Shell脚本编程大全》第二十一章:sed进阶

2023-12-21 14:55:51
胡方舟
原创 746
摘要:本文是对《Linux命令行与Shell脚本编程大全》的第二十一章的总结。

1. 多行命令

1.1 next命令

  • 单行next命令
    • 小写的n命令会告诉sed编辑器移动到数据流中的下一文本行,而不用重新回到命令的最开始再执行一遍。
      单行next命令会将数据流中的下一文本行移动到sed编辑器的模式控件中
      • sed '/aaaa/{n ; d}'  data1.txt
  • 合并文本行
    • 多行文本的next命令(大写N)会将下一文本行添加到模式空间中已有的文本后
      • 如果用N匹配的数据在数据流中的最后一行,那就不会匹配到,所以要写两种模式,一个匹配单行一个匹配多行。单行在N命令前,多行在N命令后
        • sed '
          s/System Administrator/Desktop User/
          N
          s/System\nAdministrator/Desktop\nUser/
          ' data2.txt

1.2 多行删除命令

  • 如果用N搭配单行删除命令(d)来使用,会将匹配到的行都删掉
  • 如果N搭配多行删除命令(D)来使用,该命令只会删除到换行符为止的所有字符

1.3 多行打印命令

  • 多行打印命令(P)只打印多行模式空间中的第一行,包括模式空间中知道换行符为止的所有字符

2. 保持空间

  • h: 将模式空间复制到保持空间
  • H: 将模式空间附加到保持空间
  • g: 将保持空间复制到模式空间
  • G: 将保持空间附加到模式空间
  • x: 交换模式空间和保持空间的内容

3. 排除命令

  • 感叹号(!)命令用来排除命令
  • sed -n '/header/!p' data2.txt

4. 改变流

4.1 分支

  • 格式:[address]b [label]
    • [address] :地址、地址模式或者地址区间
    • [label]:定义要跳转的位置,如果没有这个参数,跳转命令会跳转到脚本的结尾,以冒号开头,最多七个字符
      • sed '{/first/b :jump1 ; s/This is the/No jump on/
        :jump1
        s/This is the/Jump here on/}' data2.txt

4.2 测试

  • 格式:[address]t [label]
    • 如果替换命令成功匹配并替换了一个模式,测试命令就会跳转到指定的标签
    • 如果没有指定标签,测试成功之后,就会跳转到脚本的结尾
    • sed '{
      s/first/second/
      t
      s/This is the/No match on/
      }' data.txt
      • 如果第一个替换命令成功执行了,那么就不会执行第二条替换命令

5. 模式替代

5.1 &字符

  • 不管模式匹配到的是什么样的文本,都可以在替代模式中使用&符号来使用这段文本
    • echo "The cat sleeps in his hat." | sed 's/.at/"&"/g'
      > The "cat" sleeps in his "hat".
5.2 替代单独的单词
  • 用圆括号来定义替换模式中的子模式
    • 可以使用特殊字符来引用每个子模式, 如\1, \2
  • 当在替换命令中使用圆括号时,必须用转义字符将它们标示为分组字符而不是普通的圆括号。这跟转义其他特殊字符正好相反
    • echo "The furry cat is pretty." | sed 's/furry \(.at\)/\1/'
      > The cat is pretty.

6. 在脚本中使用sed

6.1 使用包装脚本

6.2 重定向sed的输出

  • 可以在脚本中使用$() 将sed编辑器命令的输出重定向到一个变量中

7. 创建sed实用工具

7.1 加倍行间距

  • sed 'G' data.txt
    • 启动sed编辑器时,保持空间只有一个空行,将它附加到已有行后面,你就在已有行后面创建了一个空白行
    • 这样的话,文件末尾也会附加一个空白行
  • sed '$!G' data.txt
    • 只要该行不是最后一行,G命令就会附加保持空间内容。这样最后就不会多一个空行了

7.2 对可能含有空白行的文件加倍行间距

  • sed '/^$/d ; $!G' data.txt
    • 先删除空白行,然后附加空白行

7.3 给文件中的行编号

  • sed '=' data.txt | sed 'N ; s/\n/ /'

7.3 打印末尾行

  • sed '{
    :start
    $q ; N ; 11,$D
    b start
    }' data.txt

7.5 删除行

  • 删除连续的空白行
    • sed '/./,/^$/!d' data.txt
      • 区间是/./ 到 /^$/。区间的开始地址会匹配任何含有至少一个字符的行,区间的结束地址会匹配一个空行,在这个区间内的行不会被删除
  • 删除开头的空白行
    • sed '/./,$!d' data.txt
      • 这个区间是从含有字符的行开始,一直到数据流结尾,在这个区间内的任何行都不会从输出中删除
  • 删除结尾的空白行
    • sed '{
      :start
      /^\n*$/{$d ; N ; b start}
      }' data.txt

8. 删除HTML标签

  • sed 's/<[^>]*>//g' data.txt
暂时没有记录
评论通过审核后显示。