【问题标题】:sed print from match until other match NOT inclusivesed 从匹配打印到其他匹配不包括在内
【发布时间】:2014-07-16 19:07:30
【问题描述】:

我想打印从一个匹配到第二个匹配的所有行,不包括第二个匹配。

到目前为止,我所做的一切都做了,而且做得太多了,因为它也打印了第二场比赛。

具体来说,假设我想打印从包含“test”的行开始的所有内容,直到但不包括以数字或左括号“[”开头的第一行。

这有一定的意义,但不是全部:

sed -n '/test/,/^[0-9]\|^\[/p' file

【问题讨论】:

标签: regex sed


【解决方案1】:

通过awk做到这一点要容易得多:

awk '/test/{p=1} /^([0-9]|\[)/{p=0} p' file

【讨论】:

  • 为我工作,谢谢!不熟悉awk:有没有办法用awk向后搜索?从相同的“测试”匹配到第一次出现以数字或括号开头的行。
  • 嗯,在awk 中可以进行向后搜索,但它并不直接,因为 awk 从上到下逐行处理输入。要自下而上处理,需要将所有行存储在内存中并在END 块中处理它们。
【解决方案2】:

使用awk

awk 'p && /^[0-9]|^\[/ { exit }; /test/{ p = 1 } p' file

例子:

$ cat temp.txt
4
1
2
3
4
5
$ awk 'p && /4/ { exit }; /2|1/{ p = 1 } p' temp.txt
1
2
3

请注意,当尚未找到 /2|1/ 时,它是如何跳过 4 的。

【讨论】:

    【解决方案3】:
    sed -n '/test/,/^[0-9[]/ {
       /test/ {
          h;b
          }
       x;p
       $ {
         x
         /^[^0-9[]/ p
         }
       }' YourFile
    

    应该有效但不优雅

    【讨论】:

      猜你喜欢
      • 2019-01-17
      • 2013-07-04
      • 2011-07-20
      • 2012-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-23
      • 1970-01-01
      相关资源
      最近更新 更多