【问题标题】:removing lines between two patterns (not inclusive) with sed使用 sed 删除两个模式(不包括在内)之间的线条
【发布时间】:2011-02-21 22:18:14
【问题描述】:

好的

我知道这是一个微不足道的问题,但是:如何从两个已知模式/单词之间的文件中删除行:

模式1
垃圾
模式2

获得:

模式1
模式2

有没有人知道学习 sed 的好(简单写!)资源​​?有很多明确的例子吗?

【问题讨论】:

标签: bash sed


【解决方案1】:

这可能对你有用:

sed '/pattern1/,/pattern2/{//!d}' file

【讨论】:

  • 如果其他人将它与 BSD sed(即 Mac OSX)一起使用,并且您收到错误 extra characters at the end of d command,只需在 d 之后添加 ;,如下所示:sed '/pattern1/,/pattern2/{//!d;}' file
  • 你如何做到这一点,包括模式?
【解决方案2】:
sed -n '/pattern1/{p; :a; N; /pattern2/!ba; s/.*\n//}; p' inputfile

解释:

/pattern1/{         # if pattern1 is found
    p               # print it
    :a              # loop
        N           # and accumulate lines
    /pattern2/!ba   # until pattern2 is found
    s/.*\n//        # delete the part before pattern2
}
p                   # print the line (it's either pattern2 or it's outside the block)

编辑:

sed 的某些版本必须用勺子喂:

sed -n -e '/pattern1/{' -e 'p' -e ':a' -e 'N' -e '/pattern2/!ba' -e 's/.*\n//' -e '}' -e 'p' inputfile

【讨论】:

  • 它给了我sed: -e expression #1, char 58: Unknown option to 's'。我的 sed 版本是 3.02
  • @Dennis:哦,编辑的版本是正确的。再次感谢!
  • 或者用更少的黑魔法sed '/pattern1/,/pattern2/{/pattern1/b;/pattern2/b;d}' inputfile :)
  • @pooh:您的第一个不适用于此测试数据(不应打印带有“xxx”的行,其他所有内容都应打印):echo -e 'aaa\npattern1\ncccxxx\ndddxxx \npattern2\nfff\nggg\npattern1\nAAAxxx\nBBBxxx \nCCCxxx\nDDDxxx\npattern2\nEEE\nFFF'
  • @Dennis Williamson:啊,是的:)在一行内容上测试!
【解决方案3】:

这很容易用 awk 完成:

BEGIN { doPrint = 1; }
/pattern1/ { doPrint = 0; print $0; }
/pattern2/ { doPrint = 1; }
{ if (doPrint) print $0; }

我发现sed info 相当容易阅读,并且有很多示例。 awk 也一样。

【讨论】:

    【解决方案4】:
    awk '/pattern1/{g=1;next}/pattern2/{g=0;next}g' file
    

    【讨论】:

      【解决方案5】:

      这个 sed 代码也可以工作:

      sed '/PATTERN1/,/PATTERN2/d' FILE
      

      【讨论】:

        【解决方案6】:

        您也可以使用 Unix 文本编辑器编辑:

        echo '
        pattern1
        garbage
        pattern2
        ' > test.txt
        
        cat <<-'EOF' | sed -e 's/^ *//' -e 's/ *$//' | ed -s test.txt &>/dev/null
          H
          /pattern1/+1,/pattern2/-1d
          wq
        EOF
        

        欲了解更多信息,请参阅:Editing files with the ed text editor from scripts

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-02-10
          • 1970-01-01
          • 1970-01-01
          • 2021-10-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-09
          相关资源
          最近更新 更多