파일에 다음 내용이 포함되어 있는 경우:
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
파일을 제자리에서 편집하려면 -i
GNU 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