문자열을 찾은 다음 두 태그 사이를 삭제하고 반복하십시오.

문자열을 찾은 다음 두 태그 사이를 삭제하고 반복하십시오.

파일에서 문자열을 찾고 그 앞에 있는 태그의 첫 번째 인스턴스를 찾은 다음 해당 태그와 닫는 태그 사이의 모든 항목을 제거한 다음 파일의 나머지 부분에 대해 이 프로세스를 반복하려면 어떻게 해야 합니까?

나는 이것을 찾고 있었지만 sed내가 아는 한 삭제할 행 수를 지정해야 하며 행 수는 두 마커마다 다를 수 있습니다.

답변1

태그가 중첩되지 않았다고 가정합니다.

perl -0777 -pe 's{<tag>.*?</tag>}{
  my $r = $&; $r =~ /string/ ? "" : $r}gse' < "$file"

답변2

할 수 있는이 작업을 수행 sed. 아이디어는 매번 레이블 사이에 행을 쌓는 것입니다. 스택에 문자열이 포함되어 있으면 삭제하고, 그렇지 않으면 인쇄합니다.

sed ':n
/<tag1>.*string.*<tag2>/d;$q;N
/<tag1>.*<tag2>/!bn'

파일이 매우 크거나 더 정확하게는 태그 1과 2 사이에 많은 수의 파일이 있거나 그 반대인 경우 이 명령은 번거롭거나 다루기 어려울 수 있습니다. 더 많은 코드를 사용하면 이러한 상황을 처리하도록 최적화할 수 있으며 GNU는 sed대부분의 경우 어려움을 겪지 않습니다.

관련 정보