grep 정규 표현식과 일치하는 각 줄마다 2줄을 필터링하는 방법은 무엇입니까?
내 최소한의 테스트는 다음과 같습니다.
SomeTestAAAA
EndTest
SomeTestABCD
EndTest
SomeTestDEFG
EndTest
SomeTestAABC
EndTest
SomeTestACDF
EndTest
예를 들어 분명히 시도해 보았지만 grep -vA 1 SomeTestAA
작동하지 않았습니다.
원하는 출력은 다음과 같습니다.
SomeTestABCD
EndTest
SomeTestDEFG
EndTest
SomeTestACDF
EndTest
답변1
(PCRE) grep
와 함께 사용할 수 있습니다 .-P
grep -P -A 1 'SomeTest(?!AA)' file.txt
(?!AA)
너비가 0인 부정 예측 모드이며 AA
이후에는 없음을 보장합니다 SomeTest
.
시험:
$ grep -P -A 1 'SomeTest(?!AA)' file.txt
SomeTestABCD
EndTest
SomeTestDEFG
EndTest
SomeTestACDF
EndTest
답변2
sed
GNU 의 명령을 사용하여 d
행을 삭제하고 접두어를 붙여 /pat/,+N
패턴 및 후속 행과 일치하는 행을 선택할 수 있습니다질소철사. 당신에 관한 한,질소= 1입니다. 왜냐하면 일치하는 행 뒤에 있는 단일 후속 행만 삭제하려고 하기 때문입니다.
sed -e '/SomeTestAAAA/,+1d'
답변3
아래 GNU 명령을 사용해 보십시오 sed
. 훌륭하게 작동합니다.
주문하다
sed '/SomeTestAA/,+1d' filename
산출
SomeTestABCD
EndTest
SomeTestDEFG
EndTest
SomeTestACDF
EndTest
답변4
p
한 가지 옵션은 ERL c
호환 r
일반 e
xpression을 사용하는 것입니다 grep
.
pcregrep -Mv 'SomeTestAA.*\n' file
이 옵션을 사용하면 -M
둘 이상의 행에서 패턴 일치를 허용합니다.