我想连接几行,对它们执行正则表达式匹配并打印它们。 我试着用sed做到这一点。
即,我用过:
cat add | sed -rn '/FIRST_LINE_REGEX/,/LAST_LINE_REGEX/s/SOME_REGEX/&/p'
它只打印与SOME_REGEX匹配的行,而我希望它连接FIRST_LINE和LAST_LINE之间的行,并打印连接,如果它与SOME_REGEX匹配。
答案 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介于两者之间时修改。