我有一个文件,foo.txt,包含以下行:
a
b
c
我想要一个简单的命令,导致foo.txt的内容为:
a
b
我有一个文件,foo.txt,包含以下行:
a
b
c
我想要一个简单的命令,导致foo.txt的内容为:
a
b
当前回答
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方法是可行的。
OK处理了大量的数据,输出是OK的,但有一个垃圾行。
如果我用管道输出脚本到:
| sed -i '$ d'我将得到以下错误,最终没有输出 Sed:没有输入文件
但是|头-n -1成功了!
要从文件中删除最后一行而不读取整个文件或重写任何内容,可以使用
tail -n 1 "$file" | wc -c | xargs -I {} truncate "$file" -s -{}
要删除最后一行并将其打印到stdout(“弹出”它),可以将该命令与tee结合使用:
tail -n 1 "$file" | tee >(wc -c | xargs -I {} truncate "$file" -s -{})
这些命令可以有效地处理一个非常大的文件。这与Yossi的答案相似,并受到了启发,但它避免了使用一些额外的函数。
如果你想重复使用这些,并且想要错误处理和一些其他功能,你可以在这里使用poptail命令: https://github.com/donm/evenmoreutils
你也可以试试这个方法:删除最后n行数的例子。
= 0;While [$a -lt 4];do sed -i '$ d' output.txt;A =expr $ A + 1;完成
删除文件(output.txt)的最后4行。
红宝石(1.9+)
ruby -ne 'BEGIN{prv=""};print prv ; prv=$_;' file