正则表达式跨多行匹配 3 个值

正则表达式跨多行匹配 3 个值

我见过一些这样的例子,但我似乎无法让它在我的特定情况下工作。假设有以下文件。

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”变量的开头,而无需手动测试它(就像我所做的那样)。

相关内容