여러 줄에 걸쳐 3개의 값을 일치시키는 정규식 [중복]

여러 줄에 걸쳐 3개의 값을 일치시키는 정규식 [중복]

나는 이에 대한 몇 가지 예를 보았지만 내 특별한 경우에는 작동하지 않는 것 같습니다. 다음 파일이 있다고 가정합니다.

foo
line 1
line 2
line 3
bar
junk
junk
foo
line 1
line 2
baz
line 4
bar

한 줄에 "baz"가 포함되어 있는 한 "foo"와 "bar" 사이의 모든 내용을 캡처하려고 합니다.

지금까지 내가 찾은 모든 것은 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/가 보이면 저장된 줄을 인쇄합니다.

내가 했던 것처럼 수동으로 테스트하지 않고는 "out" 변수의 시작 부분에 빈 줄(ORS)이 나타나는 것을 방지하는 더 현명한 방법을 찾을 수 없습니다.

관련 정보