使用sed进行正则表达式匹配,跨越多行搜索

6
我希望您能够连接几行文本,对其进行正则表达式匹配,并将其打印出来。我尝试使用sed命令实现此操作。
具体而言,我使用了以下命令:
cat add | sed -rn '/FIRST_LINE_REGEX/,/LAST_LINE_REGEX/s/SOME_REGEX/&/p'

它只打印与SOME_REGEX匹配的行,而我希望它将来自FIRST_LINE和LAST_LINE范围内的行连接起来,并在匹配SOME_REGEX时打印连接结果。

2个回答

10

当使用'/FIRST_LINE_REGEX/,/LAST_LINE_REGEX/'时,每行仍然是单独处理的,如果要连接行,需要使用保留空间或N命令将下一行附加到模式空间。以下是一种选项:

cat add | sed -rn '/FIRST_LINE_REGEX/{:a;N;/LAST_LINE_REGEX/{/SOME_REGEX/p;d};ba}'

被注释的版本:

cat add | sed -rn '/FIRST_LINE_REGEX/ {  # if line matches /FIRST_LINE_REGEX/
  :a                                       # create label a
  N                                        # read next line into pattern space
  /LAST_LINE_REGEX/ {                      # if line matches /LAST_LINE_REGEX/
    /SOME_REGEX/p                            # print if line matches /SOME_REGEX/
    d                                        # return to start
  }
  ba                                       # return to label a
}'

0

sed -n '/FIRST_LINE_REGEX/,/LAST_LINE_REGEX/p' add | sed -n '/FIRST_LINE_REGEX/ b check; H; $ b check; b; :check; x; /SOME_REGEX/p'

第二个管道部分的动机来自于这里:https://dev59.com/6ljUa4cB1Zd3GeqPNg3Q#6287105

编辑:当SOME_REGEX在中间时进行修改。


这仍然只会打印包含 SOME_REGEX 的行,我认为 OP 想要打印从 FIRST_LINE_REGEX 开始,以 LAST_LINE_REGEX 结尾,并且包含 SOME_REGEX 的整个块。 - Andrew Clark
问题在于第一部分将行作为行传递,它们仍然被单独处理。如果内容匹配SOME_REGEX,我希望第二部分打印FIRST_LINE和SECOND_LINE之间的所有内容。 - Marcin Król
强调“如果它匹配SOME_REGEX。” 已经注意到。 - Kevin Lee
1
@Gospo 另一种选择。类似于这个问题 https://dev59.com/6ljUa4cB1Zd3GeqPNg3Q 但是你有一个“开始”和“结束”标记,而不仅仅是一个“开始”标记。 - Kevin Lee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接