假设我有一个名为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
答案3
不过,您可以使用以下方法从所有行中删除换行符tr -d '\n'
:
$ echo -e "Hello"
Hello
$ echo -e "Hello" | tr -d '\n'
Hello$
您可以使用以下简单方法删除文件末尾的换行符:
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
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