예:
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
.