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

a
b
c

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

a
b

当前回答

要从文件中删除最后一行而不读取整个文件或重写任何内容,可以使用

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

其他回答

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

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

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

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

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

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

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

Linux

$表示最后一行,d表示删除:

sed '$d' ~/path/to/your/file/name

操作系统

相当于sed -i:

sed -i '' -e '$ d' ~/path/to/your/file/name

要从文件中删除最后一行而不读取整个文件或重写任何内容,可以使用

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

使用GNU sed:

sed -i '$ d' foo.txt

-i选项在3.95以上的GNU sed版本中不存在,所以你必须使用它作为一个临时文件的过滤器:

cp foo.txt foo.txt.tmp
sed '$ d' foo.txt.tmp > foo.txt
rm -f foo.txt.tmp

当然,在这种情况下,你也可以用head -n -1代替sed。

一样:

在Mac OS X(10.7.4)上,与上面的sed -i命令等价的是

sed -i '' -e '$ d' foo.txt