6

我想连接几行,对它们执行正则表达式匹配并打印它们。我试图用 sed 做到这一点。

即,我使用了:

cat add | sed -rn '/FIRST_LINE_REGEX/,/LAST_LINE_REGEX/s/SOME_REGEX/&/p'

它只打印与 SOME_REGEX 匹配的行,而我希望它连接 FIRST_LINE 和 LAST_LINE 之间的行,并在匹配 SOME_REGEX 时打印连接。

4

2 回答 2

9

当使用'/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
}'
于 2013-08-04T18:14:19.867 回答
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 ://stackoverflow.com/a/6287105/992834

编辑:当 SOME_REGEX 介于两者之间时进行了修改。

于 2013-08-04T18:20:27.643 回答