여러 줄 정규식 빈 줄 구분 기호,

여러 줄 정규식 빈 줄 구분 기호,

데이터를 덩어리로 인쇄하는 프로그램이 있습니다. 각 블록은 빈 줄로 구분됩니다.

대부분의 블록을 버리고 정규식과 일치하는 블록만 유지하고 싶습니다.

물론 스크립팅 언어나 프로그램을 사용하여 이를 수행할 수도 있지만 이는 꽤 조잡해 보입니다. 더 좋은 방법이 있나요?

답변1

awk그리고 perl이를 위해 설계된 특수 모드도 있습니다. ~라고 불리는모델. 이 모드에서 레코드는 단락입니다. 즉, 일련의 빈 줄로 구분됩니다.

의 경우 빈 문자열로 awk설정됩니다 .RS

awk -v RS= -v ORS='\n\n' '/regexp/'

그리고 perl는 그리고 입니다 -00.

perl -00 -ne 'print if /regexp/'

답변2

이는 일반적 awk으로 설정을 통해 수행 할 수 있습니다.기록 구분 기호이중 개행 문자로 변환한 다음 레코드에서 정규식 일치를 수행합니다. 예를 들어, 내가 가지고 있는 경우

block #1
this block doesnt' contain
anything I want to keep

here's a block
with some important stuff

here's another
block of stuff

and another

그 다음에

$ awk -vRS="\n\n" '/important/ {print}' blocktext.txt 
here's a block
with some important stuff

예를 들어주시면 명확하게 답변하기가 더 쉽습니다.

답변3

달리기pcregrep@steeldriver의 예에서는 여러 줄 모드에서 다음을 수행합니다.

pcregrep -Mo '\n\n\K(.|\n)*?important(.|\n)*?(?=\n\n)' file
here's a block
with some important stuff

관련 정보