Answers:
基本上,您正在模仿尾巴。在此示例中X = 20。以下示例将删除除最后20行以外的所有内容:
sed -e :a -e '$q;N;21,$D;ba' filename
说明:
-i
如果将两个-e
表达式压缩为一个,则可以使用它。您也可以通过将bash变量传递$1
给它来使用它... sed -i ':a;$q;N;'$(($1+1))',$D;ba' filename
...但是要求0
行数,将返回1行。
'$(($1+1))'
吗?
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
如果没有评论,它就很漂亮。如果要消除(例如)除最后十行之外的所有内容,请使用以下命令:
sed -ni '1h;1!H;${;g;s/.*\n\(\(.*\n\)\{9\}\)/\1/;p;}' filename
0
最后几行的请求...但是,这就是建议使用其他工具的原因之一。
根据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