带有 sed 的正则表达式,跨多行搜索

标签 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 时打印连接。

最佳答案

使用时 '/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
}'

关于带有 sed 的正则表达式,跨多行搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18045927/

相关文章:

linux - 有谁知道 sed -i 的实现?

c# - 正则表达式 - 增量替换

java - 特定数量特殊字符的正则表达式

c++ - 令人困惑的 fork 系统调用

unix - 在 Unix 邮件命令中将多个文件作为附件发送

Bash:对包含空格的变量使用 cd 命令

ruby-on-rails - 在评论中提及用户用户名 (@mention) - Rails

regex - 使用 Perl 正则表达式查找井号 (#)

无法通过管道传输到 less(1)

linux - 在 Bash 中用嵌套括号替换文本的第一个实例的最佳方法?