여러 줄로 된 텍스트 파일에서 중괄호 사이의 모든 텍스트를 어떻게 삭제합니까? 찾았 지만 멀티 라인

예:

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

되어야한다 :

This is 
that wants
 anyway.

포럼에서 비슷한 스레드 를 찾았 지만 멀티 라인 중괄호로 작동하지 않는 것 같습니다.

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

편집 : 솔루션은 괜찮은 것처럼 보이지만 원본 파일에 중괄호 중첩이 포함되어 있음을 알았습니다. 그래서 나는 새로운 질문을 열고 있습니다. 모두에게 감사합니다 : 여러 줄의 텍스트 파일에서 중첩 된 중괄호 사이의 모든 텍스트를 어떻게 삭제할 수 있습니까?



답변

$ 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

    이것은 레이블을 정의합니다 b.

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

    텍스트에 내부 중괄호가없는 한 중괄호 안의 텍스트가 제거됩니다.

  • t b

    위의 대체 명령으로 변경이 발생한 경우 label으로 다시 이동하십시오 b. 이런 식으로 대체 명령은 모든 가새 그룹이 제거 될 때까지 반복됩니다.


답변

펄 :

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 //'

답변

sed :

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

줄 바꾸기로 시작 {하고 N대체 ( {})가 이루어질 때까지 다음 줄 ( )을 가져옵니다 ( 치환이 이루어지지 않으면 T마크로 돌아갑니다 :)

한 줄에서 많은 컬이 제동되면 약간 수정됩니다.

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

괄호 안의 모든 기호를 제거하고 ( 욕설피하기 위해 실행되는 모든 기호와[^}] 동일 ), 줄에 남아 있으면 다음 줄이 없으면 다시 시작 합니다.right bracketsedleft brackedright bracket