如何从文件的最后一行中删除换行符以便向该行添加文本?

如何从文件的最后一行中删除换行符以便向该行添加文本?

假设我有一个名为file

$ cat file
Hello
Welcome to
Unix

我想and Linux在文件最后一行的末尾添加。如果我这样做,echo " and Linux" >> file将添加到新行。但我想要最后一行Unix and Linux

因此,为了解决这个问题,我想删除文件末尾的换行符。因此,如何删除文件末尾的换行符以便向该行添加文本?

答案1

如果您只想将文本添加到最后一行,那么使用 sed 非常容易。仅在范围内的行(即最后一行)上将(行尾的模式匹配)替换$为要添加的文本。$

sed '$ s/$/ and Linux/' <file >file.new &&
mv file.new file

在 Linux 上可以缩短为

sed -i '$ s/$/ and Linux/' file

如果你想删除文件中的最后一个字节,Linux(更准确地说是 GNU coreutils)提供了truncate命令,这使得这变得非常容易。

truncate -s -1 file

POSIX 的一种方法是使用dd.首先确定文件长度,然后将其截断为少一个字节。

length=$(wc -c <file)
dd if=/dev/null of=file obs="$((length-1))" seek=1

请注意,这两者都会无条件截断文件的最后一个字节。您可能想首先检查它是否是换行符:

length=$(wc -c <file)
if [ "$length" -ne 0 ] && [ -z "$(tail -c -1 <file)" ]; then
  # The file ends with a newline or null
  dd if=/dev/null of=file obs="$((length-1))" seek=1
fi

答案2

您可以使用 perl 实现此目的,如下所示:

perl -pi -e 'chomp if eof' myfile

相比之下,truncate如果实际上没有尾随换行符,dd这不会给您留下损坏的文件。myfile

(答案是由评论,并基于这个答案

答案3

不过,您可以使用以下方法从所有行中删除换行符tr -d '\n'

$ echo -e "Hello"
Hello
$ echo -e "Hello" | tr -d '\n'
Hello$

您可以使用以下简单方法删除文件末尾的换行符:

  1. head -c -1 file

man head

    -c, --bytes=[-]K
              print the first K bytes of each file; with the leading '-',
              print all but the last K bytes of each file
  1. truncate -s -1 file

man truncate

    -s, --size=SIZE
              set or adjust the file size by SIZE
SIZE 是一个整数,可选单位(例如:10M 是 10*1024*1024)。单位为 K、M、G、T、P、E、Z、Y(1024 的幂)或 KB、MB、...(1000 的幂)。 SIZE 还可以以以下修饰字符之一为前缀:“+”扩展、“-”减少、“至少”、“/”向下舍入到多个、“%”向上舍入到多个。

答案4

perl -0pi -e "s/\R\z//g" file

适用于“\r”(MAC)、“\r\n”(Windows) 和“\n”(Linux)。对于文件末尾重复的换行符(任何提示),您可以执行以下操作:

perl -0pi -e "s/\R*\z//g" file

相关内容