다음과 같은 입력이 있습니다. 사이에 있는 줄로 abc
시작하고 끝나는 모든 것을 찾고 싶지만, mno
오기 abc
전에 다시 오면 mno
첫 번째 로 일치하는 줄을 무시하고 서로 가장 가깝게 abc
시작하고 끝나는 줄만 찾으면 된다는 생각입니다. abc
그룹.mno
test.txt
파일에는 다음 데이터가 포함되어 있습니다.
알파벳 bbb 알파벳 이야 시시한 물건 알파벳 트리플 엑스 시시한 물건
예상 출력:
알파벳 이야 시시한 물건 알파벳 트리플 엑스 시시한 물건
나는 다음 grep
라이너를 사용하고 있습니다 :
grep -ozP "(?s)(abc).\*?(mno)" test.txt
결과 :
알파벳 bbb 알파벳 이야 시시한 물건 알파벳 트리플 엑스 시시한 물건
처음 두 줄은 출력에 나타나지 않아야 합니다. grep
원하는 결과를 얻기 위해 무엇을 수정할 수 있는지 알려주세요 .
답변1
이 문제를 해결하는 한 가지 방법은 tac
일치 항목 찾기를 사용하여 파일을 되돌리는 것입니다.시작그리고 mno
그리고끝AND abc
그런 다음 반전하여 원하는 결과를 얻습니다. 나는 다음과 같은 작업을 수행하고 있습니다.
$ tac test.txt | pcregrep -M 'mno(\n|.)*?abc' | tac
abc
yyy
mno
abc
xxx
mno
pcregrep
( 여러줄 플래그 에 사용합니다 -M
)
답변2
Perl이 당신에게 맞는 경우를 대비해:
#!/usr/bin/env perl
# saved lines to print out
my @out = ();
# should we save lines?
my $saving = 0;
while (<>) {
if (/abc/) {
if ($saving) {
# this is the second /abc/, so dump what we were saving and start over
@out = ($_);
} else {
# this is the first /abc/, so save it and start saving lines
push @out, $_;
$saving = 1;
}
} elsif (/mno/) {
if ($saving) {
# print what we've saved, plus this /mno/ ending line, then reset
print @out, $_;
@out=();
$saving=0;
}
} else {
# otherwise, save lines if we should be
push @out, $_ if $saving;
}
}
답변3
grep -ozP "(?s)(abc)[^(abc)]*(mno)" 1
abc
yyy
mno
abc
xxx
mno