텍스트 줄이 여러 블록에 모여 있고 각 블록이 최소한 하나의 빈 줄로 구분되어 있는 텍스트 파일을 생각해 보세요. Bash 문을 사용하여 <
또는의 모든 텍스트를 어떻게 삭제할 수 있습니까 ?>
\n\n
즉, 각 합계 쌍 <
사이의 모든 항목을 제거합니다 >
. a가 <
끝나지 않으면 >
블록 끝까지(빈 줄)까지 모두 삭제하지만절대블록 외부를 삭제하세요!
개념적으로 안전을 위해 구문 분석하기 전에 덩어리를 목록의 개체로 물리적으로 분리해야 합니까? 아니면 수행 중인 작업을 알고 있는 한 직선형 텍스트 구문 분석 작업입니까?
예시 텍스트:
This is the first
block of text.
<-- empty line
<delete me>
This is the second block.
<delete
here>
<delete this, but
<-- empty line
do not delete this>
<delete this too>
Third block here.
(more blocks)
결과는 다음과 같습니다.
This is the first
block of text.
<-- empty line
This is the second block.
<-- empty line
do not delete this>
Third block here.
답변1
awk의 단락 모드를 사용해 보세요:
$ awk -v RS= -v ORS='\n\n' '{gsub(/<[^>]+>?\n?/, "")}1' ip.txt
This is the first
block of text.
This is the second block.
do not delete this>
Third block here.
-v RS=
이로 인해 하나 이상의 연속된 빈 줄이 입력 레코드 구분 기호로 사용됩니다.-v ORS='\n\n'
출력 레코드 구분 기호를 두 개의 줄 바꿈으로 설정gsub(/<[^>]+>?\n?/, "")
삭제<
뒤에 -문자가 아닌 문자가 오고>
, 그 뒤에 선택적>
문자와 개행 문자가 옵니다.1
입력 레코드의 내용을 인쇄하는 관용적인 방법
같은 것perl
perl -00 -lpe 'BEGIN{$\="\n\n"} s/<[^>]+>?\n?//g' ip.txt
답변2
암소 비슷한 일종의 영양Awk
해결책:
awk -v RS='[<>]' '/\n\n/{ sub(/^[^\n]+\n/, ""); print $0 RT }' file
RS='[<>]'
<
- 및>
레코드 구분 기호로 처리/\n\n/
- 현재 레코드에 줄 바꿈이 2개 포함된 경우:sub(/^[^\n]+\n/, "")
- 첫 번째 개행 문자를 포함하여 모든 것을 제거합니다.print $0 RT
- 현재 레코드를 인쇄하고 그 뒤에RT
(예:>
)RT
- 기록 종결자. 지정된 문자 또는 정규식과 일치하는 입력 텍스트로Gawk
설정합니다 .RT
RS
산출:
<empty line>
don't delete this>