첫 번째 일치 항목을 포함하는 줄 아래의 n 줄에 있는 모든 줄을 삭제합니다.

첫 번째 일치 항목을 포함하는 줄 아래의 n 줄에 있는 모든 줄을 삭제합니다.

파일에 다음 내용이 포함되어 있는 경우:

Line 1
FooLine 5
Line 2
Line 55
Line 3
Line 4
Line 5
Line 6
Line 7
Line 5
Line 8
Line 9

이제 파일에 다음 내용만 포함되도록 "5번째 줄" 아래 두 줄 아래 줄을 삭제하려면 어떻게 해야 합니까?

Line 1
FooLine 5
Line 2
Line 55
Line 3
Line 4
Line 5
Line 6
Line 7

참고: 이것은 질문의 약간 개선되고 반전된 버전입니다.첫 번째 일치 항목이 포함된 줄 위의 n 줄 앞의 모든 줄을 삭제합니다.

답변1

그리고 sed:

$ sed '/^Line 5$/{n;n;q;}' file
Line 1
FooLine 5
Line 2
Line 55
Line 3
Line 4
Line 5
Line 6
Line 7

파일을 제자리에서 편집하려면 -iGNU sed또는 호환 버전, -i ''FreeBSD sed또는 호환 버전 옵션을 추가하세요.

답변2

awk를 사용하십시오.

$ awk -v n=2 'c&&!--c{exit} $0 == "Line 5"{c=n+1} 1' file
Line 1
FooLine 5
Line 2
Line 55
Line 3
Line 4
Line 5
Line 6
Line 7

바라보다sed-or-awk-a-line-following-a-matching-pattern을 사용하여 인쇄/17914105#17914105설명 및 관련 관용어를 보려면

답변3

다음은 몇 가지 방법입니다. 둘 다 정확한 문자열이 포함된 줄 뒤의 두 줄만 삭제하기 시작한다고 가정합니다 Line 5.

  • 진주

    $ perl -lne '$k=$. if /^Line 5$/; print; exit if $k and $.==$k+2;' file
    Line 1
    FooLine 5
    Line 2
    Line 55
    Line 3
    Line 4
    Line 5
    Line 6
    Line 7
    

    perl -i -lne '$k=$. if /^Line 5$/; print; exit if $k and $.==$k+2;' file이를 사용하여 파일을 제자리에서 편집 할 수 있습니다 .

  • awk

    awk '(/^Line 5$/){ k=NR } 1; (k && NR==k+2){exit};' file
    Line 1
    FooLine 5
    Line 2
    Line 55
    Line 3
    Line 4
    Line 5
    Line 6
    Line 7
    

답변4

사용행복하다(이전 Perl_6)

~$ raku -pe 'if m/^Line \h 5$/ {.put; get.put xx 2; last};'  file

또는:

~$ raku -pe 'm/^Line \h 5$/ && .put && get.put xx 2 && last;'  file 

또는:

~$ raku -ne 'm/^Line \h 5$/ ?? (.put; get.put xx 2; last) !! .put;'  file

다음은 Perl 계열의 프로그래밍 언어인 Raku로 작성한 답변입니다. Raku에는 유니코드에 대한 고급 지원 기능이 내장되어 있습니다.

첫 번째 답변 쌍에서는 -pe한 줄씩 자동 인쇄 플래그를 사용하십시오. 필요한 줄을 읽을 때까지(정규식으로 결정됨) 줄은 자동으로 인쇄됩니다. 이 시점에서 필요한 라인은 out 이고 put, 코드는 get다른 두 라인을 지시하고 out배치합니다. 그게 전부입니다 last(즉, 코드가 종료됩니다). 이 두 가지 예 중 두 번째 경우에는 andthen대신 를 사용할 수 있습니다 &&.

세 번째 답변에서는 -ne자동 인쇄가 아닌 한 줄씩 플래그를 사용하십시오. 각 줄은 Raku의 것으로 읽혀집니다.시험 ?? 진짜 !! 잘못된삼항 연산자는 정규식을 통해 원하는 행을 찾습니다. 원하는 동작이 True인 경우 out이면 put코드는 get두 줄을 더 지시하고 out이를 입력하면 끝입니다 last(즉, 코드가 종료됩니다). 정규식을 통한 원하는 동작이 False이면 직접 출력하고 put한 줄씩, 가능하면 파일 끝까지 계속 읽습니다.

입력 예:

Line 1
FooLine 5
Line 2
Line 55
Line 3
Line 4
Line 5
Line 6
Line 7
Line 5
Line 8
Line 9

예제 출력:

Line 1
FooLine 5
Line 2
Line 55
Line 3
Line 4
Line 5
Line 6
Line 7

get.put참고: 위의 세 가지 답변 모두 빈 줄은 잘 처리되지만 존재하지 않는 줄을 반환하려고 하면(예를 들어 파일 끝에 너무 가까운 경우) 코드에서 오류가 발생합니다. 오류.

이를 보다 우아하게 처리하려면(일치하는 행 다음에 사용 가능한 모든 행을 요청된 수까지 반환) @terdon의 Perl 답변과 유사한 다음 코드를 사용하십시오. 아래를 $k"와 동일하게 설정하십시오.n+1"lines는 현재 줄에 더하기를 반환합니다"N" - 다음 줄( $k=3위와 동일한 출력 제공):

~$ raku -ne 'my $k=3 if m/^Line \h 5$/; $k.put && --$k; last unless $k;'  file

https://docs.raku.org
https://raku.org

관련 정보