여러 줄 모드에서 끝까지 파일 내용을 표시하는 방법패턴 자체를 포함하여?
얼마전에 비슷한 질문을 했는데 내용이 달라서 별도의 새로운 질문으로 올려볼까 생각중입니다. 그러니 단지 그것 때문에 이 중복 항목을 표시하지 마십시오!
예를 들어 다음과 같은 텍스트 파일이 있다고 가정해 보겠습니다.
cat
dog
fox
cow
dove
bird
bunny
gnu
hen
dove
bird
buffalo
내 스키마가 다음과 같은 경우:
dove
bird
bunny
내가 얻고 싶은 것은 :
dove
bird
bunny
gnu
hen
dove
bird
buffalo
내 실제 파일은 상당히 크기 때문에 이를 달성할 수 있는 방법이 여러 개 있는 경우 더 빠른 방법을 선호합니다.
답변1
패턴이 처음 나타날 때부터 인쇄를 시작하려면 쉽습니다. 내가 설명한 것과 동일한 논리에 따라또 다른 대답, 그러나 몇 가지 추가 논리가 있습니다.
파싱.sed
/^dove$/ { # Match multi-line pattern
N # /
N # /
/\nbird\nbunny$/bb # When matched jump to label b
}
d # Restart with next line if no match
:b # \
n # Print the rest of the file
bb # /
다음과 같이 실행하세요:
sed -f parse.sed infile
또는 휴대용 단일 라이너로:
sed -n -e '/^dove$/{N;N;/\nbird\nbunny$/bb' -e '};d;:b' -e 'p;n;bb' infile
두 경우 모두 출력:
dove
bird
bunny
gnu
hen
dove
bird
buffalo
답변2
Perl 솔루션은 다음과 같습니다.
perl -0777 -ne 'print $1,$2 if m/(dove.bird.bunny)(.*)/sm' myfile
이 출력은 다음과 같습니다.
dove
bird
bunny
gnu
hen
dove
bird
buffalo
켜다-0777
흡연전체 파일을 메모리로 읽는 모드입니다. sm
일치 수정자를 사용하면 문자열을 여러 줄로 처리하면서 점 일치 개행이 가능합니다.
이 -n
스위치는 입력 파일에 대한 읽기 루프를 생성합니다. 순서가 있을 때비둘기에 묶인 토끼$1
보세요, 나머지 줄과 함께 캡처되고 $2
전체 일치가 성공할 때 인쇄되는 내용입니다.
답변3
앗해결책:
awk -v RS=" " '{ # considering space as record separator
for(i=1;i<=NF;i++) { # iterating through all fields
if ($i=="dove" && $(i+1)=="bird" && $(i+2)=="bunny") { f=1 }
if (f) print $i
}
}' file
산출:
dove
bird
bunny
gnu
hen
dove
bird
buffalo