답변:
d
13 번째 줄을 간단히 소개하십시오 :
sed '13d' <file.txt
그리고 위의 보완을 수행하는 일반적인 방법은 다음과 같습니다.
sed '13!d' <file.txt
할 수 있기 때문에 :
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)로 시도했고 위의 형태로는 제대로 작동하지 않는다는 것을 알았습니다. 문제는 다음과 같습니다.
;
줄을 구분하는 데 일반적으로 작동하는 것처럼 보이지만 레이블 다음에는 작동하지 않습니다.;
는 한 줄 {}
명령 그룹 에서 마지막 명령 뒤에 필요한 것으로 보이지만 GNU sed는 그렇지 않습니다.\n
일반적으로 정규 표현식 내에서 사용할 수 있지만 []
대괄호 표현식 내에서는 사용할 수 없습니다 . 따라서 줄 바꿈을 제외하려면 [[:alnum:][:punct:][:graph:][:blank:]]
다른 문자 (특히 다른 제어 문자)를 제외 할 수 있지만 대신 비슷한 것을 사용할 수 있습니다 .따라서 이것은 플랫폼 독립적 인 버전에서 시도한 것입니다.
sed -n ':a
${s/^[[:alnum:][:punct:][:graph:][:blank:]]*\n//p;q;};N;4,${P;D;};ba'
이것은 OSX 및 Ubuntu에서 작동하는 것으로 보입니다.
head
/ tail
)는 수행하는 작업에 최적화되어 있기 때문에 .
head
/tail
솔루션이sed
솔루션 보다 훨씬 느리다는 것을 나타냅니다 . 그래도 고마워.