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

18 浏览
0 Comments

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

我有一个文件foo.txt,其中包含以下内容:\n

a
b
c

\n我想要一个简单的命令,使得foo.txt的内容变为:\n

a
b

0
0 Comments

在Bash中删除文件的最后一行是一个常见的需求。有时候我们需要删除文件末尾多余的空行或者特定的行,以满足我们的需求。下面是一个解决这个问题的例子:

对于大型文件,我使用其他答案遇到了麻烦,因为我处理的是一个非常大的文件(约300GB),而且这些解决方案都不可扩展。以下是我的解决方案:

filename="example.txt"
file_size="$(stat --format=%s "$filename")"
trim_count="$(tail -n1 "$filename" | wc -c)"
end_position="$(echo "$file_size - $trim_count" | bc)"
dd if=/dev/null of="$filename" bs=1 seek="$end_position"

或者,可以将其作为一行命令:

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

简单来说,通过计算文件的长度减去最后一行的长度,然后使用`dd`命令将`/dev/null`中的一个字节写入文件的末尾位置,从而实现删除最后一行的目的。

这种方法非常快速,因为`tail`从文件的末尾开始读取,而`dd`命令会直接在原地覆盖文件,而不是复制(和解析)文件的每一行,这是其他解决方案所做的事情。

需要注意的是,这种方法会直接在原文件中删除最后一行!在尝试自己的文件之前,请备份或者先在一个虚拟文件上测试。

这种方法对于大型文件非常有效。

文章完整内容如上所示。

0
0 Comments

Remove the last line from a file in Bash

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

问题的出现原因:

在Bash中,我们需要删除文件的最后一行。然而,如果使用传统的方法,比如使用sed命令,它对于大文件来说非常慢。因此,我们需要寻找一种更快速且简单的解决方案。

解决方法:

根据提供的内容,我们可以找到两种解决方法。

第一种方法是使用head命令来删除文件的最后一行。具体的命令如下:

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

这个命令的作用是将除了最后一行以外的所有行输出到temp.txt文件中,然后将temp.txt文件重命名为foo.txt,从而实现删除最后一行的效果。

如果我们需要删除文件的第一行,可以使用另一种方法,即使用tail命令。具体的命令如下:

tail -n +2 foo.txt

这个命令的作用是从第2行开始输出文件的所有行,从而实现删除第一行的效果。

此外,在Mac系统中,head -n -1命令可能不起作用。为了解决这个问题,我们可以安装GNU core utilities并使用ghead命令代替head命令。具体的安装命令如下:

brew install coreutils

安装完成后,我们可以使用ghead命令来执行删除最后一行的操作。

除了以上的解决方法,我们还可以通过编写一个简单的Bash脚本来自动化删除操作。具体的脚本如下:

FILE=$1; TAIL=$2; head -n -${TAIL} ${FILE} > temp ; mv temp ${FILE}

通过运行这个脚本,我们可以删除文件的最后几行。例如,如果我们想要删除myfile文件的最后4行,可以执行以下命令:

./TAILfixer myfile 4

当然,在执行脚本之前,我们需要将脚本设置为可执行文件:

chmod +x TAILfixer

通过以上的解决方法,我们可以快速、简单地删除Bash中文件的最后一行。与传统的方法相比,这些方法更加高效,并且适用于处理大文件。无论是使用head命令还是tail命令,或者编写一个自动化脚本,我们都可以轻松地实现删除文件最后一行的操作。

0
0 Comments

在Bash中删除文件的最后一行是一个常见的需求。有两种常用的方法可以实现这个目标。

第一种方法是使用GNU sed。在GNU sed版本3.95之后,可以使用以下命令删除文件的最后一行:

sed -i '$ d' foo.txt

如果你使用的是旧版本的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。在Mac OS X(截至10.7.4版本),可以使用以下命令删除文件的最后一行:

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

需要注意的是,在Mac OS X上,head -n -1无法正常工作。

关于'$ d'的正则表达式是什么意思?这是一个关于删除最后一行的问题,所以我认为这是对于所有查看该问题的人来说最重要的部分。感谢!

: 绝对不能把$ d当作正则表达式。它是一个sed命令。d是删除一行的命令,而$表示“文件中的最后一行”。当在命令之前指定一个位置(在sed术语中称为“范围”)时,该命令仅应用于指定的位置。因此,这个命令明确地说“在文件的最后一行范围内,删除它”。如果你问我,这非常简洁明了。

如果只有最后一行是空行,如何删除它?

-i选项与哪些版本的sed兼容?

:更新为GNU sed;不清楚各种BSD/UNIX/MacOS sed版本的情况...

当文件末尾有多个空行时,这个方法似乎会删除最后两个空行而不是最后一个空行。

正如Panu Haaramo指出的,这个方法在末尾有空行的情况下会出现问题。

0