Я видел несколько примеров этого, но я не могу заставить это работать в моей конкретной ситуации. Допустим, есть файл ниже.
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» без ее ручной проверки (как я это делаю).