나는 다음의 보완/"반대"를 하고 싶습니다
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)로 시도했는데 위의 형식으로는 제대로 작동하지 않는 것을 발견했습니다. 문제는 다음과 같습니다
;
선 분리는 일반적으로 작동하지만 레이블 이후에는 작동하지 않는 것 같습니다.;
BSD sed는 한 줄 명령 그룹{}
의 마지막 명령 다음에 필요한 것처럼 보이지만 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에서 작동하는 것 같습니다.