sed에서 N 번째 행을 제외한 모든 행을 마지막 행에 어떻게 인쇄합니까?


9
  • 나는 보완 / "반대"를하고 싶습니다

    sed 13q;d <file.txt
    

    보다 일반적으로 이런 종류의 보완 / 반전 / 반대를 할 수 sed있습니까? 아니면 정규 표현식에만 해당됩니까?

  • 세 번째 줄부터 마지막 ​​줄까지는 어떻게 인쇄합니까? 이 둘이 필요 tac하고 앞으로 카운트 sed? 아니면 sed뒤에서 셀 수 있는 방법이 있습니까?

답변:


12

1 부

d13 번째 줄을 간단히 소개하십시오 :

sed '13d' <file.txt

그리고 위의 보완을 수행하는 일반적인 방법은 다음과 같습니다.

sed '13!d' <file.txt

2 부

할 수 있기 때문에 :

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

(가) 주 4더 필요한 수보다 하나입니다. 따라서 마지막 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 

글렌 잭맨의 귀중한 추가 사항 :

그것은 "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에서 작동하는 것으로 보입니다.


@jimmij SE 네트워크의 관련 질문에 대한 다른 답변은 head/ tail솔루션이 sed솔루션 보다 훨씬 느리다는 것을 나타냅니다 . 그래도 고마워.
동 형사상

3
@isomorphismes 전체 파일을 거치지 않으면 어떤 프로그램도 파일의 줄 수를 알 수 없습니다. 그 주위에 방법이 없습니다. 맨 아래부터 계산하는 유일한 방법은 파일을 뒤집고 맨 위에서 계산하거나 두 번 구문 분석하는 것입니다. 따라서 머리 / 꼬리가 점점 빨라질 것입니다.
terdon

@isomorphismes ... ( head/ tail)는 수행하는 작업에 최적화되어 있기 때문에 .
peterph

@isomorphismes-필요한 모든 부분으로 편집
Digital Trauma

좋은! 어떻게 든 더 복잡해질 것으로 기대했기 때문에 대답을 변경해야했습니다. :)
peterph
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.