2021 年更新:
使用vim的ex模式更简单:(灵感来自this answer)
vim - -esc '$-3,$m0|%p|q!' --not-a-term # when processing a pipe
vim file.txt -esc '$-3,$m0|%p|q!' --not-a-term # when processing a file to stdout
vim file.txt -esc '$-3,$m0|wq' --not-a-term # when editing a file inline
这会将最后 4 行(最后一行 + 最后一行之前的 3 行)移到顶部。将3 更改为您想要的号码。
MWE:
seq 10 | vim - '-esc$-3,$m0|%p|q!' --not-a-term
输出:
7
8
9
10
1
2
3
4
5
6
2020 年更新:
如果输入源来自管道,您可能会发现很难。在这种情况下,您可以使用
awk '{a[NR-1]=$0}END{for(i=0;i<NR;++i)print(a[(i-4+NR)%NR])}'
这会将所有行存储在内存中(这可能是一个问题),然后输出它们。更改命令中的4 以查看不同的结果。
显示最后n行,然后显示其余的:
tail -n 4 file; head -n -4 file
来自man head:
-n, --lines=[-]NUM
打印前 NUM 行而不是前 10 行;使用前导“-”,打印每个文件的最后 NUM 行以外的所有行
tail -n 4 将显示文件的最后 4 行。
如果您希望通过管道传输这些数据,您需要像这样将它们放在一起:
( tail -n 4 file; head -n -4 file ) | wc
或者你可以使用 vim 来编辑文件内联:
vim +'$-3,$m0' +'wq' file
vim 的+ 选项将运行它后面的 (Ex) 命令。 $-3,$m0 表示将最后一行上方的 3 行之间的行移动到文件的开头。注意+和命令之间不能有空格。
或者在vim普通模式下使用命令:
vim +'norm G3kdGggPZZ' file
G 转到文件末尾; 3k 上移 3 行; dG 删除到文件末尾; gg 转到文件顶部; P 在此行之前粘贴已删除的行; ZZ 保存并退出。