【问题标题】:sed extract text between two patterns where second pattern may be either of onesed 在两个模式之间提取文本,其中第二个模式可能是其中之一
【发布时间】:2013-03-04 07:42:08
【问题描述】:

我正在尝试提取模式 1(固定)和模式 2(可以是 p2-1/p2-2)之间的文本。 你能告诉我如何在一个命令中实现这一点吗?

文件以start 开头并以endclose 结尾

File1:
======
junktest
data
start
stackoverflow
sed
close

File2:
======
data2
start
stackoverflow
end

我可以使用

从 File1 中提取文本
sed -n "/start/,/close/p"

从 File2 和

sed -n "/start/,/end/p"

我需要一个 sed 命令来实现这两者.. 类似:

sed -n "/start/, /close or end /p"

【问题讨论】:

  • 一次打印两个文件还是两个模式空间?
  • 其实我只是把它做成了两个文件。但是我从一个命令中得到了一些输出,我必须从输出中提取两个模式之间的文本。开始模式是固定的。但是结束格式可以是两个(固定)之一。有什么办法可以在 sed 命令中指定
  • 啊,尝试使用|,它指定了一个“或”,例如sed -n "/start/,/close|end/p"
  • 不,这似乎不起作用!
  • BSD sed 不同。也许尝试在管道字符的命令中添加 -E 。它用于扩展正则表达式。

标签: linux unix sed


【解决方案1】:

GNU sed 和 BSD sed

sed -nE '/start/,/close|end/p' file

【讨论】:

  • 作为一名 OS X 用户,我总是对sed 的答案有疑问,非常感谢您在 BSD 中进行测试!
【解决方案2】:

这个 awk 看起来更好

awk '/start/,/end|close/' file

【讨论】:

    【解决方案3】:
    sed -n -E "/Word1/,/Word2-1/p" | sed -n -E "/Word1/,/Word2-2/p"
    

    【讨论】:

      【解决方案4】:

      awk 很容易:

      $ awk '/start/{p=1}p{print}/end|close/{p=0}' file
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-30
        • 2017-12-08
        • 1970-01-01
        相关资源
        最近更新 更多