데이터를 덩어리로 인쇄하는 프로그램이 있습니다. 각 블록은 빈 줄로 구분됩니다.
대부분의 블록을 버리고 정규식과 일치하는 블록만 유지하고 싶습니다.
물론 스크립팅 언어나 프로그램을 사용하여 이를 수행할 수도 있지만 이는 꽤 조잡해 보입니다. 더 좋은 방법이 있나요?
답변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