나는 읽고 있었다일치 후 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
다음 입력에서 해당 줄과 다음 두 줄을 제거합니다. 상대 주소 지정은 표준 +2
GNU 확장입니다.sed
sed
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