猿问

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

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


a

b

c

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


a

b


守着一只汪
浏览 773回答 3
3回答

慕盖茨4494581

这是迄今为止最快,最简单的解决方案,尤其是在大文件上:head -n -1 foo.txt > temp.txt ; mv temp.txt foo.txt如果要删除第一行,请使用以下命令:tail -n +2 foo.txt这意味着输出线从第2行开始。请勿sed用于删除文件顶部或底部的行-如果文件很大,这将非常慢。

慕森卡

使用GNU sed:sed -i '$ d' foo.txt该-i选项在GNU sed3.95之前的版本中不存在,因此您必须将其用作带有临时文件的过滤器:cp foo.txt foo.txt.tmpsed '$ d' foo.txt.tmp > foo.txtrm -f foo.txt.tmp当然,在这种情况下,您也可以使用head -n -1代替sed。苹果系统:在Mac OS X(从10.7.4版开始)上,上述sed -i命令等效于sed -i '' -e '$ d' foo.txt

慕田峪9158850

我在这里遇到的所有问题都遇到了麻烦,因为我正在使用巨大的文件(〜300Gb),并且没有一种解决方案可以扩展。这是我的解决方案:dd if=/dev/null of=<filename> bs=1 seek=$(echo $(stat --format=%s <filename> ) - $( tail -n1 <filename> | wc -c) | bc )换句话说:找出要结束的文件的长度(文件的长度减去最后一行的长度,使用bc),然后将该位置设置为文件的结尾(将的dd一个字节&nbsp; /dev/null写入它)。这是快速的,因为tail从头开始读取,并且dd将覆盖原位文件,而不是复制(和解析)文件的每一行,这是其他解决方案所做的。注意:这将从适当的文件中删除该行!在尝试对自己的文件进行备份之前,请对虚拟文件进行备份或测试!
随时随地看视频慕课网APP
我要回答