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