첫 번째 연속 패턴을 무시하면서 grep에서 여러 패턴을 검색하는 방법

첫 번째 연속 패턴을 무시하면서 grep에서 여러 패턴을 검색하는 방법

다음과 같은 입력이 있습니다. 사이에 있는 줄로 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

관련 정보