我見過一些這樣的例子,但我似乎無法讓它在我的特定情況下工作。假設有以下文件。
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”變數的開頭,而無需手動測試它(就像我所做的那樣)。