我想连接几行,对它们执行正则表达式匹配并打印它们。我试图用 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 -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 介于两者之间时进行了修改。