대괄호 사이의 텍스트를 제거하되 빈 줄을 넘지 않도록 하세요.

대괄호 사이의 텍스트를 제거하되 빈 줄을 넘지 않도록 하세요.

텍스트 줄이 여러 블록에 모여 있고 각 블록이 최소한 하나의 빈 줄로 구분되어 있는 텍스트 파일을 생각해 보세요. Bash 문을 사용하여 <또는의 모든 텍스트를 어떻게 삭제할 수 있습니까 ?>\n\n

즉, 각 합계 쌍 <사이의 모든 항목을 제거합니다 >. a가 <끝나지 않으면 >블록 끝까지(빈 줄)까지 모두 삭제하지만절대블록 외부를 삭제하세요!

개념적으로 안전을 위해 구문 분석하기 전에 덩어리를 목록의 개체로 물리적으로 분리해야 합니까? 아니면 수행 중인 작업을 알고 있는 한 직선형 텍스트 구문 분석 작업입니까?

예시 텍스트:

This is the first
block of text.
                             <-- empty line
<delete me>
This is the second block.
<delete
here>
<delete this, but
                             <-- empty line
do not delete this>
<delete this too>
Third block here.

(more blocks)

결과는 다음과 같습니다.

This is the first
block of text.
                             <-- empty line
This is the second block.
                             <-- empty line
do not delete this>
Third block here.

답변1

awk의 단락 모드를 사용해 보세요:

$ awk -v RS= -v ORS='\n\n' '{gsub(/<[^>]+>?\n?/, "")}1' ip.txt 
This is the first
block of text.

This is the second block.


do not delete this>
Third block here.
  • -v RS=이로 인해 하나 이상의 연속된 빈 줄이 입력 레코드 구분 기호로 사용됩니다.
  • -v ORS='\n\n'출력 레코드 구분 기호를 두 개의 줄 바꿈으로 설정
  • gsub(/<[^>]+>?\n?/, "")삭제 <뒤에 -문자가 아닌 문자가 오고 >, 그 뒤에 선택적 >문자와 개행 문자가 옵니다.
  • 1입력 레코드의 내용을 인쇄하는 관용적인 방법


같은 것perl

perl -00 -lpe 'BEGIN{$\="\n\n"} s/<[^>]+>?\n?//g' ip.txt

답변2

암소 비슷한 일종의 영양Awk해결책:

awk -v RS='[<>]' '/\n\n/{ sub(/^[^\n]+\n/, ""); print $0 RT }' file
  • RS='[<>]'<- 및 >레코드 구분 기호로 처리
  • /\n\n/- 현재 레코드에 줄 바꿈이 2개 포함된 경우:
    • sub(/^[^\n]+\n/, "")- 첫 번째 개행 문자를 포함하여 모든 것을 제거합니다.
    • print $0 RT- 현재 레코드를 인쇄하고 그 뒤에 RT(예: >)
    • RT- 기록 종결자. 지정된 문자 또는 정규식과 일치하는 입력 텍스트로 Gawk설정합니다 .RTRS

산출:

<empty line>   
don't delete this>

관련 정보