我有一个文件,foo.txt,包含以下行:
a
b
c
我想要一个简单的命令,导致foo.txt的内容为:
a
b
我有一个文件,foo.txt,包含以下行:
a
b
c
我想要一个简单的命令,导致foo.txt的内容为:
a
b
当前回答
删除zshrc文件中的最后一行,例如:
cat ~/.zshrc
sed -i '' -e '$ d' ~/.zshrc
cat ~/.zshrc
其他回答
要从文件中删除最后一行而不读取整个文件或重写任何内容,可以使用
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
Linux
$表示最后一行,d表示删除:
sed '$d' ~/path/to/your/file/name
操作系统
相当于sed -i:
sed -i '' -e '$ d' ~/path/to/your/file/name
红宝石(1.9+)
ruby -ne 'BEGIN{prv=""};print prv ; prv=$_;' file
awk 'NR>1{print buf}{buf = $0}'
本质上,这段代码表示:
对于第一行之后的每一行,打印缓冲行
对于每一行,重置缓冲区
缓冲区延迟了一行,因此最终打印的是第1行到第n-1行
awk "NR != `wc -l < text.file`" text.file &> newtext.file
这段代码可以达到目的。