나는 그 일에 집중하려고 노력하고 있다. 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 .