저는 sed를 사용하여 서로 다른 두 패턴 사이의 행을 반환합니다 [(1) <Directory>, (2) </Directory>]
. 주어진 입력 파일에 대해 sed에는 여러 일치 항목이 있으며 각 개별 일치 항목을 파이프하는 것이 가능한지 알고 싶습니다.
내가 기본적으로 하고 싶은 일은 다음과 같습니다.
sed -n "/ddd/,/</ddd>p" < input.conf | grep Options
...
ddd Start of Match group #1
eee
fff
/ddd End of Match group #1
...
ddd Start of Match group #2
iii
yyy
/ddd End of Match group #2
일치하는 각 그룹에 fff 패턴이 포함되어 있는지 확인하고 싶습니다.
답변1
복잡한 요구 사항을 고려할 때 이 문제를 해결하려면 awk가 더 적합합니다.
처음부터 끝까지 sed 인쇄에 해당하는 내용은 다음과 같습니다(awk).
$ awk '/^ddd/{p=1};p;/^[/]ddd/{p=0}' file
ddd Start of Match group #1
eee
fff
/ddd End of Match group #1
ddd Start of Match group #2
iii
yyy
/ddd End of Match group #2
amtch를 사용하면 ^
amtch가 줄의 시작 부분에 있고 줄의 시작 부분에서만 a와 [\]
일치합니다 .\
테스트를 전환하려면 시작 줄과 끝 줄을 제거하면 됩니다.
$ awk '/^[/]ddd/{p=0};p;/^ddd/{p=1}' file
eee
fff
iii
yyy
테스트해야 할 남은 것은 (범위 내에서) fff
. 이는 다음을 통해 수행할 수 있습니다.
awk ' /^[/]ddd/{p=0;if(found==0){print NR};found=0};
p&&($0~/fff/){found=1};
/^ddd/{p=1}
' file
그러면 해당 그룹에 포함되지 않은 그룹의 마지막 줄의 줄 번호(NR)가 인쇄됩니다 fff
.
답변2
노력하다
sed -n '/ddd/ {:L; N; /\/ddd/!bL; /fff/ !{p; =;} }' file
가 발생하면 ddd
패턴 공간의 라인을 수집한 /ddd
다음 테스트 fff
하고 존재하지 않는 경우 그룹과 그룹의 마지막 라인 번호를 인쇄합니다.