"grep -v"를 수행하고 일치 후 "n"줄을 제외하는 방법은 무엇입니까? [복사]

"grep -v"를 수행하고 일치 후 "n"줄을 제외하는 방법은 무엇입니까? [복사]

나는 읽고 있었다일치 후 grep -v를 실행하고 다음 줄을 제외하려면 어떻게 해야 합니까?sed또는 다른 유틸리티를 사용하여 일치 후 이 두 줄이나 숫자를 제외하는 방법을 알고 싶습니다.

user@linux:~$ cat -n file.txt 
     1  SomeTestAAAA
     2  Random String
     3  EndTest
     4  SomeTestABCD
     5  Random String
     6  EndTest
     7  SomeTestDEFG
     8  Random String
     9  EndTest
    10  SomeTestAABC
    11  Random String
    12  EndTest
    13  SomeTestACDF
    14  Random String
    15  EndTest
user@linux:~$ 

첫 번째 질문

나는 다음을 사용하여 이 작업을 수행할 수 있었습니다 grep -P. 불행하게도 --출력에 원하지 않는 문자가 있습니다.

이것을 제거하는 방법?

user@linux:~$ grep -P -A 2 'SomeTest(?!AA)' file.txt
SomeTestABCD
Random String
EndTest
SomeTestDEFG
Random String
EndTest
--
SomeTestACDF
Random String
EndTest
user@linux:~$ 

질문 2

awk나는 또한 이전 답변에 표시된 대로 이 작업을 수행했습니다 . 그러나 비슷한 패턴으로 인해 이 경우에만 작동합니다 EndTest. 임의의 단어이고 패턴이 없으면 EndTest어떻게 되나요 ?

비슷한 일을 할 수 있을까요 grep -v -A 2 SomeTestAA? 이것이 작동하지 않는다는 것을 알고 있지만 원하는 출력은 다음과 유사합니다.

user@linux:~$ awk  'BEGIN{ RS=ORS="\nEndTest\n"} !/'"^SomeTestAA/" file.txt 
SomeTestABCD
Random String
EndTest
SomeTestDEFG
Random String
EndTest
SomeTestACDF
Random String
EndTest
user@linux:~$ 

답변1

GNU 사용 sed:

$ sed '/AA/,+2d' <file
SomeTestABCD
String
EndTest
SomeTestDEFG
String
EndTest
SomeTestACDF
String
EndTest

GNU sed스크립트는 해당 문자열이 포함된 줄을 찾은 AA다음 입력에서 해당 줄과 다음 두 줄을 제거합니다. 상대 주소 지정은 표준 +2GNU 확장입니다.sedsed

Standard 를 사용하여 sed두 줄을 삭제합니다.

sed -n '/AA/{n;n;d;}; p' <file

이는 입력의 모든 행을 암시적으로 출력하지 않고 사용됩니다 sed( -n). 패턴이 일치 하면 AA다음 두 줄을 명시적으로 읽고 삭제합니다. 패턴을 트리거하지 않는 모든 라인이 인쇄됩니다.

Standard 를 사용하여 sed다음 EndTest줄을 제거합니다.

sed '/AA/,/^EndTest$/d' <file

이렇게 하면 문자열이 포함된 줄부터 AA패턴 바로 다음 줄까지 모든 줄이 삭제됩니다 ^EndTest$.


awk일치 후 두 줄을 무시 하는 데 사용됩니다 AA.

awk '/AA/ { getline; getline; next } 1' <file

사용법은 awk마지막 sed변형과 동일합니다.

awk '/AA/,/^EndTest$/ { next } 1' <file

관련 정보