头/尾的否定参数

Ame*_*ina 16 osx options shell-script tail head

这个问题的变体肯定在不同的地方被问过几次,但我试图M从文件中删除最后一行而没有运气。

第二个最投票的答案这个问题建议做以下摆脱在文件的最后一行:

head -n -1 foo.txt > temp.txt
Run Code Online (Sandbox Code Playgroud)

但是,当我在 OSX & Zsh 中尝试时,我得到:

head: illegal line count -- -1
Run Code Online (Sandbox Code Playgroud)

这是为什么?我如何删除M 最后一个第一个 N给定文件的行?

Sté*_*las 23

您可以使用以下命令删除前 12 行:

tail -n +13
Run Code Online (Sandbox Code Playgroud)

(这意味着从第 13 行开始打印。)

一些head类似 GNUhead支持的实现:

head -n -12
Run Code Online (Sandbox Code Playgroud)

但这不是标准的。

tail -r file | tail -n +12 | tail -r
Run Code Online (Sandbox Code Playgroud)

将适用于那些具有tail -r(另请参见 GNU tac)但次优的系统。

哪里n是 1:

sed '$d' file
Run Code Online (Sandbox Code Playgroud)

你也可以这样做:

sed '$d' file | sed '$d'
Run Code Online (Sandbox Code Playgroud)

删除 2 行,但这不是最佳选择。

你可以做:

sed -ne :1  -e 'N;1,12b1' -e 'P;D'
Run Code Online (Sandbox Code Playgroud)

但请注意,在某些实现中,这不适用于较大的nsed

awk

awk -v n=12 'NR>n{print line[NR%n]};{line[NR%n]=$0}'
Run Code Online (Sandbox Code Playgroud)

m从开头和n结尾删除行:

awk -v m=6 -v n=12 'NR<=m{next};NR>n+m{print line[NR%n]};{line[NR%n]=$0}'
Run Code Online (Sandbox Code Playgroud)