为了账号安全,请及时绑定邮箱和手机立即绑定

从Bash中的文件中删除最后一行

从Bash中的文件中删除最后一行

守着一只汪 2019-10-05 11:18:28
我有一个文件,foo.txt其中包含以下几行:abc我想要一个导致以下内容的简单命令foo.txt:ab
查看完整描述

3 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

这是迄今为止最快,最简单的解决方案,尤其是在大文件上:


head -n -1 foo.txt > temp.txt ; mv temp.txt foo.txt

如果要删除第一行,请使用以下命令:


tail -n +2 foo.txt

这意味着输出线从第2行开始。


请勿sed用于删除文件顶部或底部的行-如果文件很大,这将非常慢。


查看完整回答
1 反对 回复 2019-10-05
?
慕森卡

TA贡献1806条经验 获得超8个赞

使用GNU sed:


sed -i '$ d' foo.txt

该-i选项在GNU sed3.95之前的版本中不存在,因此您必须将其用作带有临时文件的过滤器:


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


查看完整回答
反对 回复 2019-10-05
?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

我在这里遇到的所有问题都遇到了麻烦,因为我正在使用巨大的文件(〜300Gb),并且没有一种解决方案可以扩展。这是我的解决方案:


dd if=/dev/null of=<filename> bs=1 seek=$(echo $(stat --format=%s <filename> ) - $( tail -n1 <filename> | wc -c) | bc )

换句话说:找出要结束的文件的长度(文件的长度减去最后一行的长度,使用bc),然后将该位置设置为文件的结尾(将的dd一个字节  /dev/null写入它)。


这是快速的,因为tail从头开始读取,并且dd将覆盖原位文件,而不是复制(和解析)文件的每一行,这是其他解决方案所做的。


注意:这将从适当的文件中删除该行!在尝试对自己的文件进行备份之前,请对虚拟文件进行备份或测试!


查看完整回答
反对 回复 2019-10-05
  • 3 回答
  • 0 关注
  • 772 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信