
다른 도구를 사용하여 수행할 수 있지만 sed
.
답변1
기본적으로 꼬리를 에뮬레이트하고 있습니다. 이 예에서는 X = 20입니다. 다음 예에서는 마지막 20줄을 제외한 모든 줄을 삭제합니다.
sed -i -e :a -e '$q;N;21,$D;ba' filename
설명:
- -e :a는 a라는 레이블을 생성합니다.
- 다음 -e:
- $q - 패턴 공간이 마지막 줄이면 종료하고 인쇄합니다.
- N - 다음 줄
- 21,$D - 라인 번호가 >= 21인 경우 "D" 명령을 실행합니다(21,$ = 파일의 끝인 $까지의 21번째 라인)
- ba - 스크립트의 시작 부분인 'a' 라벨로 분기됩니다.
답변2
sed
이와 같은 작업의 경우 매우 복잡합니다. tail
, grep
또는 awk
이를 훨씬 쉽게 만들 수 있으므로 대신 사용해야 합니다. 그러고보니 그~이다가능한.
다음 솔루션은 다음에서 조정되었습니다.sed 및 여러 줄 검색 및 바꾸기.
sed -ni '
# if the first line copy the pattern to the hold buffer
1h
# if not the first line then append the pattern to the hold buffer
1!H
# if the last line then ...
${
# copy from the hold to the pattern buffer
g
# delete current line if it is followed by at least X more lines
# replace X-1 with the proper value
s/.*\n\(\(.*\n\)\{X-1\}\)/\1/
# print
p
}
' filename
주석이 없으면 멋진 한 줄짜리가 됩니다. 예를 들어 마지막 10줄을 제외한 모든 것을 제거하려면 다음을 사용하십시오.
sed -ni '1h;1!H;${;g;s/.*\n\(\(.*\n\)\{9\}\)/\1/;p;}' filename
답변3
스크립트를 기반으로sed 매뉴얼의 섹션 4.13당신은 다음과 같이 할 수 있습니다 :
n=10
(( n > 1 )) && script='1h; 2,'$n'{H;g;}; $q; 1,'$((n-1))'d; N; D'
(( n > 1 )) || script='$!d'
sed -i "$script" infile
답변4
tac|sed|tac>&&(mv||cat>)
다음 명령 조각은 모두 효과적으로 다음을 제외한 모든 항목을 삭제합니다.마지막5윤곽의 ~/file1
. 그대로 유지하고 싶다면마지막10윤곽, |sed '1,5!d;'
다음을 사용 하여 대체할 수 있습니다 |sed '1,10!d;'
.등등, 당신이 적합하다고 생각하는대로.
tac ~/"file1" |sed '1,5!d;' |tac >"/tmp/file2" &&mv "/tmp/file2" ~/"file1"
tac ~/"file1" |sed '1,5!d;' |tac >"/tmp/file2" &&cat "/tmp/file2" >~/"file1"