sed의 맨 아래에서 N번째 줄을 제외한 모든 것을 인쇄하는 방법은 무엇입니까?

sed의 맨 아래에서 N번째 줄을 제외한 모든 것을 인쇄하는 방법은 무엇입니까?
  • 나는 다음의 보완/"반대"를 하고 싶습니다

    sed 13q;d <file.txt
    

    보다 일반적으로 에서 이러한 보수/역/반대 연산을 수행하는 것이 가능합니까 sed? 아니면 정규 표현식에만 해당되나요?

  • 마지막 줄에서 세 번째 줄을 제외한 모든 내용을 인쇄하려면 어떻게 해야 합니까? 여기에는 2비트가 필요 tac하고 앞으로 계산해야 합니까 sed? 아니면 sed뒤에서부터 계산할 수 있는 방법이 있나요 ?

답변1

1 부

13번째 줄을 삭제 하세요 d:

sed '13d' <file.txt

위 사항을 보완하는 일반적인 접근 방식은 다음과 같습니다.

sed '13!d' <file.txt

2 부

왜냐하면 다음과 같은 일이 가능하기 때문입니다:

sed -n ':a;${P;q};N;4,$D;ba' <file.txt

4숫자는 필요한 것보다 1 더 많습니다. 따라서 마지막 10개 행을 원한다면 이것은 11.

시험용 seq:

$ seq 100 | sed -n ':a;${P;q};N;4,$D;ba'
98
$ 

설명하려고 노력하다

:a        # define label a
${        # match the last line
    P     # print the first line of the pattern space
    q     # quit
}
N         # match all lines: append the next line to the pattern
4,${      # match the range of lines 4 to the end of the file
    D     # delete the first line of the pattern space
}
ba        # match all lines: jump back to label a 

Glen Jackman의 귀중한 추가 사항:

그것은 "N번째 행만"입니다. 이것은 "N 라인을 제외한 모든 라인"입니다:

sed -n ':a;${s/^[^\n]*\n//;p;q};N;4,${P;D};ba'

GNU sed에서 작동하지만 이 \n시퀀스는 다른 sed에서는 작동하지 않을 수 있습니다.


BSD sed(OSX)로 시도했는데 위의 형식으로는 제대로 작동하지 않는 것을 발견했습니다. 문제는 다음과 같습니다

  1. ;선 분리는 일반적으로 작동하지만 레이블 이후에는 작동하지 않는 것 같습니다.
  2. ;BSD sed는 한 줄 명령 그룹 {}의 마지막 명령 다음에 필요한 것처럼 보이지만 GNU sed는 그렇지 않습니다.
  3. \n이는 일반적으로 정규 표현식에서는 작동하지만 []대괄호 표현식에서는 작동하지 않습니다. 따라서 개행 문자를 제외하려면 다음과 같은 것을 사용할 수 있습니다 [[:alnum:][:punct:][:graph:][:blank:]]. 단, 이는 다른 문자(특히 다른 제어 문자)를 제외할 수 있습니다.

따라서 다음은 보다 플랫폼 독립적인 버전을 시도한 것입니다.

sed -n ':a
${s/^[[:alnum:][:punct:][:graph:][:blank:]]*\n//p;q;};N;4,${P;D;};ba'

이것은 OSX와 Ubuntu에서 작동하는 것 같습니다.

관련 정보