我有一个文件,foo.txt,包含以下行:

a
b
c

我想要一个简单的命令,导致foo.txt的内容为:

a
b

当前回答

在macOS上,head -n -1不起作用,但你可以使用这个命令:

cat file.txt | tail -r | tail -n +2 | tail -r

Tail -r将其输入中的行顺序颠倒 Tail -n +2输出输入中从第二行开始的所有行

其他回答

删除zshrc文件中的最后一行,例如:

cat ~/.zshrc
sed -i '' -e '$ d' ~/.zshrc
cat ~/.zshrc
awk 'NR>1{print buf}{buf = $0}'

本质上,这段代码表示:

对于第一行之后的每一行,打印缓冲行

对于每一行,重置缓冲区

缓冲区延迟了一行,因此最终打印的是第1行到第n-1行

OK处理了大量的数据,输出是OK的,但有一个垃圾行。

如果我用管道输出脚本到:

| sed -i '$ d'我将得到以下错误,最终没有输出 Sed:没有输入文件

但是|头-n -1成功了!

Mac用户

如果只希望删除最后一行输出而不更改文件本身做

Sed -e '$ d' foo.txt

如果要删除输入文件本身的最后一行

Sed -i " -e '$ d' foo.txt

下面是一个使用海绵的解决方案(来自moreutils包):

head -n -1 foo.txt | sponge foo.txt

解决方案总结:

如果您想要一个快速的大文件解决方案,请使用有效的tail或dd方法。 如果你想要一些容易扩展/调整和可移植的东西,可以使用重定向和移动方法。 如果您想要一些易于扩展/调整的东西,文件不是太大,可移植性(即依赖于moreutils包)不是问题,并且您喜欢方形裤子,那么可以考虑海绵方法。

与“重定向和移动”方法相比,海绵方法的一个好处是保留了文件权限。

与“重定向和移动”方法相比,Sponge使用了更多的RAM。这可以提高一些速度(只有20%),但如果你对速度感兴趣,“高效尾巴”和dd方法是可行的。