각 단락이 약 15줄인 수백 개의 단락이 포함된 파일이 있습니다. 패턴을 찾아야 해요.발생 횟수: 1. 이 패턴이 단락에서 발견되면 전체 단락을 인쇄해야 합니다. 단락은 2개의 줄 바꿈으로 구분됩니다.
나는 분명히 파일의 첫 번째 항목을 인쇄하는 다음 코드 줄을 시도했습니다. 어떻게든 루프를 사용하여 이러한 이벤트를 모두 인쇄할 수 없습니다.
sed -n '1,/Occurrence: 1/p' ystdef.txt | tail -9 > ystalarm.txt
g
이를 수행하기 위해 (전역) 플래그를 사용할 수 있습니까 sed
? 그렇다면 어떻게?
나는 이 명령을 알고 있지만 grep -A/B/C
내 Cygwin 터미널에서는 작동하지 않습니다.
답변1
입력 레코드가 최소 두 개의 줄 바꿈 시퀀스로 구분되는 awk의 "단락 모드"를 사용할 수 있습니다. RS
빈 문자열로 설정하면 활성화 됩니다 .
awk -v RS= '/Occurance: 1/' ystdef.txt
이 단락은 모두 함께 접혀 인쇄됩니다(내용 사이에 개행 문자 포함). awk를 사용하면 출력 구분 기호를 입력 구분 기호와 일치시킬 수 없지만(일부 GNU awk 확장 제외) 단락 구분 기호를 두 개의 줄 바꿈으로 쉽게 정규화할 수 있습니다.
awk -v RS= -v ORS='\n\n' '/Occurance: 1/' ystdef.txt
끝에 추가 줄 바꿈을 원하지 않는 경우:
awk -v RS= '/Occurance: 1/ {if (not_first) print ""; print; not_first=1}' ystdef.txt
답변2
이것은 GNU에 있습니다 sed
:
sed '/./{H;$!d};x;/SEARCH/!d'
이식 가능/POSIX 구문:
sed -e '/./{H;$!d;}' -e 'x;/SEARCH/!d'
줄에 하나 이상의 문자가 포함되어 있으면 이전 공백이 추가됩니다. 마지막 H
줄이면 제거됩니다. 이는 비어 있지 않은 모든 줄이 저장되고 출력에서 제거됨을 의미합니다.!
$
그래서 만약 라인이아니요 d
삭제되면 홀드 및 패턴 공간의 내용이 sed
변경됩니다 . x
이렇게 하면 빈 줄 하나만 위한 공간과 마지막 빈 줄 이후의 모든 줄에 대한 패턴 공간이 남습니다.
sed
그런 다음 패턴을 해결합니다 /SEARCH/
. !
찾을 수 없으면 인쇄 d
하지 않고 패턴 공간을 제거하고, 그렇지 않으면 기본적으로 단락을 인쇄합니다.
다음은 귀하의 질문을 입력으로 받아들이는 쉘 함수입니다.
참고 - 쉽게 읽을 수 있도록 이 웹사이트에서 코드가 강조 표시될 때 처리된 데이터에 주석이 표시됩니다. 해시 없이 또는 그대로 작동합니다.
_pgraph() {
sed '/./{H;$!d};x;/'"$1"'/!d'
} <<\DATA
# I have a file with hundreds of paragraphs of
# around 15 lines each. I need to search for a
# pattern, say Occurance: 1. If this pattern is
# found in the para, I need to print the entire
# paragraph. Note that the paragraps are seperared
# by 2 new line characters.
# I have tried the below line of code and this
# obviously prints the first occurence in the
# file. I am somehow unable to use a loop and
# print all such occurances.
# sed -n '1,/Occurance: 1/p' ystdef.txt | tail -9 >
# ystalarm.txt Can I use the g (global) flag with
# sed to make this work? If yes, how?
# Note that I am aware of the grep -A/B/C commands
# but they wont work on my cygwin terminal.
DATA
이제 할 수 있습니다:
_pgraph Note
###OUTPUT
# I have a file with hundreds of paragraphs of
# around 15 lines each. I need to search for a
# pattern, say Occurance: 1. If this pattern is
# found in the para, I need to print the entire
# paragraph. Note that the paragraps are seperared
# by 2 new line characters.
# Note that I am aware of the grep -A/B/C commands
# but they wont work on my cygwin terminal.
또는 더 구체적으로:
_pgraph 'Note that I'
# Note that I am aware of the grep -A/B/C commands
# but they wont work on my cygwin terminal.
함수 자체에 텍스트 입력을 첨부하지 않고도 모든 파일에 대해 동일한 작업을 수행할 수 있습니다. 함수 정의의 모든 항목을 제거하고 다음과 같이 실행하면 됩니다 <<\DATA
.DATA
_pgraph 'PATTERN' </path/to/input.file
답변3
Perl에서는 "단락 모드"를 사용할 수 있습니다.
perl -ne 'BEGIN{ $/ = "" } print if /pattern/' input