![正则表达式跨多行匹配 3 个值](https://linux22.com/image/112167/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E8%B7%A8%E5%A4%9A%E8%A1%8C%E5%8C%B9%E9%85%8D%203%20%E4%B8%AA%E5%80%BC.png)
我见过一些这样的例子,但我似乎无法让它在我的特定情况下工作。假设有以下文件。
foo
line 1
line 2
line 3
bar
junk
junk
foo
line 1
line 2
baz
line 4
bar
我试图捕获“foo”和“bar”之间的所有内容,只要它包含带有单行的“baz”。
到目前为止,我发现的所有内容都非常适合查找 foo 和 bar 之间的所有内容,但似乎没有什么适合仅查找包含 baz 的内容。
编辑:以下内容对我有用:
sed -n '/foo/{:a;N;/bar/!ba; /baz/p}' input.txt
答案1
awk '
/foo/ { save=1 }
/baz/ { p=1 }
/bar/ { if (p) { print out ORS $0; } p=0; save=0; out="" }
{ if (save) { if (out) { out = out ORS $0 } else { out = $0 } } }
' input
如果我们看到 /foo/; 则开始保存行;如果我们看到 /baz/,则决定它们值得打印,并且一旦我们看到 /bar/,如果我们看到 /baz/,则打印保存的行。
我无法找到一种更聪明的方法来防止空行(ORS)出现在“out”变量的开头,而无需手动测试它(就像我所做的那样)。