正则表达式与sed,搜索多行

时间:2013-08-04 18:04:19

标签: regex unix sed

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

即,我用过:

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

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

2 个答案:

答案 0 :(得分: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
}'

答案 1 :(得分: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介于两者之间时修改。