예:
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 bracket
sed
left bracked
right bracket