여러 줄로 된 텍스트 파일에서 중괄호 사이의 모든 텍스트를 어떻게 삭제합니까?


10

예:

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

되어야한다 :

This is 
that wants
 anyway.

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

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

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


1
이것을 시도sed '/{/{:1;N;s/{.*}//;T1}' multiline.file
Costas

답변:


10
$ 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. 이런 식으로 대체 명령은 모든 가새 그룹이 제거 될 때까지 반복됩니다.


당신의 대답은 완벽한 것 같습니다. 내가 방금 연 새 질문 (원본 질문 읽기 EDIT)이 정확히 동일하지 않은 한, 당신도 대답해야한다고 생각합니다. 포럼 규칙으로도 괜찮습니까?
Sopalajo de Arrierez

@ John1024 님, OP가 새로운 질문에 대한 내용을 게시 했으므로 여기 로 수정 사항을 옮길 수 있습니다 .
Ramesh

1
확인. 저기서 복사하여 새 질문의 샘플 텍스트를 사용하도록 수정했습니다.
John1024

5

펄 :

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

감사합니다. 매우 도움이되었습니다. 이는 내가 인정한다, 내가 ah..em에 나오지과 사투를 벌인 대 분 이내에 함수의 내용을 대체하는 빌드 스크립트에 문제를 해결 (hours..cough..cough) 더 많은 시간을 도왔다
AndrewD

4

sed :

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

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

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.