여러 줄 텍스트 파일에서 중괄호 사이의 모든 텍스트를 삭제하는 방법은 무엇입니까?

여러 줄 텍스트 파일에서 중괄호 사이의 모든 텍스트를 삭제하는 방법은 무엇입니까?

예:

This is {
the multiline
text file }
that wants
{ to be
changed
} anyway.

다음과 같아야 합니다:

This is 
that wants
 anyway.

내가 좀 찾았어비슷한 포럼에 있지만 여러 줄 중괄호에서는 작동하지 않는 것 같습니다.

가능하다면 grep, sed, awk 등을 기반으로 한 솔루션과 같은 한 줄 접근 방식을 선호합니다.

편집: 해결 방법은 괜찮은 것 같지만 원본 파일에 중괄호 중첩이 포함되어 있는 것으로 나타났습니다. 그래서 새로운 질문을 드립니다. 다들 감사 해요:여러 줄 텍스트 파일에서 중첩된 중괄호 사이의 모든 텍스트를 제거하는 방법은 무엇입니까?

답변1

$ sed ':again;$!N;$!b again; s/{[^}]*}//g' file
This is 
that wants
 anyway.

설명하다:

  • :again;$!N;$!b again;

    그러면 전체 파일이 패턴 공간으로 읽혀집니다.

    :again라벨입니다. N다음 줄을 읽어보세요. 마지막 줄이 아닌 경우 레이블 $!b again로 다시 분기합니다 .again

  • s/{[^}]*}//g

    이렇게 하면 중괄호 안의 모든 표현식이 제거됩니다.

Mac OSX에서는 다음을 시도해 보세요.

sed -e ':again' -e N -e '$!b again' -e 's/{[^}]*}//g' file

중첩된 버팀대

이것을 많은 중괄호가 중첩된 테스트 파일로 사용하겠습니다.

a{b{c}d}e
1{2
}3{
}
5

중첩된 중괄호를 처리하기 위한 수정 사항은 다음과 같습니다.

$ sed ':again;$!N;$!b again; :b; s/{[^{}]*}//g; t b' file2
ae
13
5

설명하다:

  • :again;$!N;$!b again

    이는 이전과 동일합니다. 전체 파일을 읽습니다.

  • :b

    이는 label 을 정의합니다 b.

  • s/{[^{}]*}//g

    이렇게 하면 텍스트에 내부 중괄호가 포함되어 있지 않은 한 중괄호 안의 텍스트가 제거됩니다.

  • t b

    위의 대체 명령으로 인해 변경이 발생하면 label 로 다시 이동하세요 b. 이런 방식으로 모든 가새 그룹이 제거될 때까지 바꾸기 명령을 반복합니다.

답변2

진주:

perl -0777 -pe 's/{.*?}//sg' file

그 자리에서 편집하고 싶다면

perl -0777 -i -pe 's/{.*?}//sg' file

파일을 단일 문자열로 읽고 전역 검색 및 바꾸기를 수행합니다.

그러면 중첩된 지원이 처리됩니다.

perl -ne 'do {$b++ if $_ eq "{"; print if $b==0; $b-- if $_ eq "}"} for split //'

답변3

Seder:

sed '/{/{:1;N;s/{.*}//;T1}' multiline.file

줄에서 시작하여 대체가 이루어질 때까지 {다음 줄( )을 가져옵니다 .N{}T:

라인에 컬이 많이 포함되어 있으면 살짝 수정하세요.

sed ':1; s/{[^}]*}// ; /{/ { /}/!N ; b1 }' multiline.file

괄호 안의 모든 기호를 제거합니다 [^}](제외한 모든 기호right bracket탐욕스럽지 않게 만들기 위해 sed), 해당 행에 예약이 있는 경우 left bracked- 그렇지 않은 경우 추가된 다음 행의 시작 부분으로 돌아갑니다 right bracket.

관련 정보