일치하는 패턴이 있는 줄을 제외하고 다음 줄을 삭제합니다.

일치하는 패턴이 있는 줄을 제외하고 다음 줄을 삭제합니다.

sed '/pattern/Q'또는 를 사용하여 일치하는 패턴 아래 줄을 삭제할 수 있지만 sed '/pattern/,$d'일치하는 패턴이 포함된 줄도 삭제됩니다.

일치하는 패턴이 포함된 행을 제외하고 그 아래 행만 삭제하는 방법은 무엇입니까?

답변1

Q다음을 사용 하여 이것을 지나치게 복잡하게 만들고 있습니다.GNU sed 관련 명령:

Q [종료 코드]

이 명령은 하나의 주소만 허용합니다.

이 명령은 q와 동일하지만 패턴 공간의 내용을 인쇄하지 않습니다. q와 마찬가지로 호출자에게 종료 코드를 반환하는 기능을 제공합니다.

만약 너라면아니요이 특정 동작을 원합니다(예:하다종료하기 전에 일치하는 패턴 공간의 내용을 인쇄하려면 다음 일반 q명령을 사용하십시오.

sed '/pattern/q'

답변2

이것은 트릭을 수행해야합니다

sed -n '/pattern/{p;q};p'

-n스위치는 sed기본적으로 인쇄되지 않습니다.

{p;q}패턴이 관찰되면 라인을 인쇄하고 종료함을 나타냅니다 .

;p일치하는 항목이 없으면 기본 작업은 인쇄입니다.

답변3

단순성, 명확성 및 이식성을 위해 awk는 정규식( 3이 경우 a)과 일치하는 줄 아래의 모든 줄을 삭제하는 등의 작업에 sed보다 더 나은 선택입니다.

$ seq 10 | awk '{print} /3/{exit}'
1
2
3

또는 일치하는 줄도 제거하려면 인쇄 후가 아닌 인쇄 전 정규식이 테스트되는 위치를 이동하십시오.

$ seq 10 | awk '/3/{exit} {print}'
1
2

또는 3번 발생 후 4줄을 삭제할 수 있습니다.

$ seq 10 | awk 'NR>n{print} /3/{n=NR+4}'
1
2
3
8
9
10

아니면 관용구 "f"를 사용하세요인쇄를 위해 sed- 또는 awk-a-line-follow-a-matching-pattern을 사용하십시오.:

$ seq 10 | awk 'c&&c--{next} /3/{c=4} {print}'
1
2
3
8
9
10

이 명령은 모든 Unix 시스템의 모든 awk에서 작동하며 원하는 것과 유사한 작업을 수행하는 것이 간단합니다.

답변4

사용진주:

~$ seq 10 | perl -pe 'last if /3/'
1
2

#OR:

~$ seq 10 | raku -ne '/3/ ? last : print $_;'
1
2

사용행복하다(이전 Perl_6):

~$ seq 10 | perl -pe 'last if /3/'
1
2

#OR:

~$ seq 10 | raku -ne '/3/ ?? (last) !! (put $_);'
1
2

sedPerl과 Raku는 awk. 플래그 위의 -pe입력에서 코드를 한 줄씩 실행합니다.그리고자동 인쇄, 플래그는 -ne입력 시 코드를 한 줄씩 실행합니다.아니요자동으로 인쇄합니다. 위의 네 가지 답변 모두에서 last한 줄씩 루프를 종료하는 것이 사용됩니다. Perl과 Raku의 삼항 연산자 사이에는 미묘한 차이가 있는데, 그 이유는 주로 Raku가 :언어의 다른 측면에서 콜론을 배치하기 때문입니다.

https://perldoc.perl.org
https://docs.raku.org

관련 정보