【问题标题】:sed print text between PATTERN1 and PATTERN2 OR PATTERN3sed 在 PATTERN1 和 PATTERN2 或 PATTERN3 之间打印文本
【发布时间】:2020-12-21 04:25:38
【问题描述】:

sed 可以在 PATTERN1 和 PATTERN2 或 PATTERN3 之间打印文本吗?例如,对于下面的两个示例,我希望显示输出:

示例 1

Not lemur
Lemur
  Ring-Tailed
  Mouse
  Catta
Fusa
  Bad

示例 2

Not lemur
Lemur
  Ring-Tailed
  Mouse
  Catta

期望的输出:

Lemur
  Ring-Tailed
  Mouse
  Catta

到目前为止,我的 sed 命令是 sed -n '/^Lemur/,$p',但这也会打印出我不想要的“Fusa\n Bad”。 sed 是否具有“或”功能,例如 '/^Lemur/,($|^[^\s])p',其意图是从 Lemur 匹配到输入的末尾或不以空格开头的行。另外,我只想打印以空格开头的第一个模式(狐猴)之后的行(即我不想在第一个示例中打印“Fusa”)。

【问题讨论】:

    标签: sed pattern-matching


    【解决方案1】:

    sed 是对单个字符串执行s/old/new/ 的最佳工具。对于比这更复杂的事情,只需使用 awk。

    $ awk '/^\S/{f=/^Lemur/} f' file1
    Lemur
      Ring-Tailed
      Mouse
      Catta
    
    $ awk '/^\S/{f=/^Lemur/} f' file2
    Lemur
      Ring-Tailed
      Mouse
      Catta
    

    如果您没有\S 的 GNU awk,那么只需改用 [^[:space:]]

    【讨论】:

    • 非常有趣的解决方案。我花了一分钟来思考它,但我想我明白了。谢谢!
    【解决方案2】:

    这可能对你有用(GNU sed):

    sed ':a;/^Lemur/{:b;n;/^\S/ba;bb};d' file
    

    标记循环的开始。

    如果一行以单词Lemur开头:

    • 标记循环的开头。
    • 打印当前行并将下一行提取到模式空间中。
    • 如果模式空间以非空格字符开头,则转到循环的开头并重复。
    • 否则转到循环的开头。

    删除所有其他行。


    另一种选择:

    sed -n '/^\S/{:a;x;/^Lemur/p;$q;x;h};//!H;$ba' file
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      • 2018-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多