문자열을 포함하지 않는 모든 줄과 인접한 줄을 어떻게 인쇄합니까?

문자열을 포함하지 않는 모든 줄과 인접한 줄을 어떻게 인쇄합니까?

나는 그 일에 집중하려고 노력하고 있다. Auto-installed: 1다음 출력에서 ​​포함된 모든 줄과 이전 두 줄을 제외하고 싶습니다 . 나는 순진하게도 이것이 grep -v -B2 string문제를 해결할 것이라고 생각했습니다. 말할 필요도 없이 상황은 더욱 악화되었습니다.

내용은 다음과 같습니다.

Package: libopencore-amrwb0
Architecture: amd64
Auto-Installed: 1

Package: transfig
Architecture: amd64
Auto-Installed: 0

Package: xfig-libs
Architecture: amd64
Auto-Installed: 1

Package: xaw3dg
Architecture: amd64
Auto-Installed: 0

결과는 다음과 같습니다.

Package: transfig
Architecture: amd64
Auto-Installed: 0

Package: xaw3dg
Architecture: amd64
Auto-Installed: 0

(빈 줄은 표시되지 않습니다. 빈 줄이 표시되지 않으면 플러스이지만 필수는 아닙니다. 결과에는 자동 설치 값이 0인 패키지도 포함되어야 합니다.)

나도 할 수 있다는 걸 알아개행 문자 일치그러나 아무것도 인쇄되지 않거나 모든 것이 인쇄되지만 사이에 줄 바꿈이 있습니다.

어떤 솔루션이라도 허용됩니다. grep(심지어 이맥스일 수도 있습니다).

답변1

데이터가 어떻게 구성되어 있는지 잘 모르겠지만 표시된 대로라면 다음은 어떻습니까?

grep -B2 'Auto-Installed: [^1]'

이는 각 섹션에 한 줄이 포함되어 있다고 가정하는데 Auto-Installed이는 정확하지 않을 수 있습니다.

이것은 awk 프로그램이고 내 생각엔 이것이 정확히 당신이 원하는 것을 수행한다고 생각합니다.

awk 'BEGIN{deleted=3}
     !deleted{printf "%s",l[NR%3]}
     deleted {--deleted}
     {l[NR%3]=/./?$0"\n":$0}
     /Auto-Installed: 1/{deleted=3}
     END{for(i=NR+deleted;i<NR+3;++i)printf "%s",l[i%3]}'

답변2

내 생각엔 이게 너한테 도움이 될 것 같아

sed ':a
     $!N                          # slurp
     /Auto-Installed: 1/s/.*//    # kill all buffered on match
     $!{/\n.*\n/{P;D}}            # P/D any third line, D cycles w/o read
     $!ba                         # if no P/D, cycle w/o read anyway
    '

답변3

이들을 제외시키려고 하는 대신, 원하는 반대 행을 선택하는 것이 어떨까요?

$ grep -B 2 "Auto-Installed: 0" data.txt 
Package: transfig
Architecture: amd64
Auto-Installed: 0

"Autoinstall: 1"이 포함된 섹션 제외

"autoinstall:1"이 포함된 섹션을 제외하는 문제를 해결하기 위해 사용하고 싶지만 grep논리를 사용하는 경우, 저는 다음을 사용하여 이 방법을 생각해내지 않았습니다.PCRE 시설GNU grep에서.

$ grep -B2 -P 'Auto-Installed: (?!1)' data.txt 

$ grep -B2 -P 'Auto-Installed: (?!1)' data.txt 
Package: transfig
Architecture: amd64
Auto-Installed: 0

위에서 사용됨Perl의 예측 기능, (?!..).이를 통해 나중에 일치 항목에 대해 값 1이 포함되지 않은 행을 찾을 수 있습니다 Auto-Installed:. 그런 다음 "일치"( ) 앞에 2줄을 표시하도록 지시합니다 grep.-B2

답변4

이것은 필수 Perl 방식입니다:

perl -000ne 'print unless /Auto-Installed: 1/' file

기적적으로 -000이것은 Perl의단락 모드이로 인해 파일이 단락으로 나누어집니다. 즉, 레코드는 두 개 이상의 연속 \n문자로 구분됩니다.

또한 항목 사이에 빈 줄이 인쇄됩니다. 이를 제거하려면 실행할 수 있습니다.

perl -000ne 'print unless /Auto-Installed: 1/' file | grep .

관련 정보