각 sed 일치마다 별도

각 sed 일치마다 별도

저는 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하고 존재하지 않는 경우 그룹과 그룹의 마지막 라인 번호를 인쇄합니다.

관련 정보