如何在文件末尾删除换行符?


33

让我清除换行符:

$ echo Hello > file1 ; cat file1
Hello
$ echo -n  Hello > file2 ; cat file2
Hello$ 

在这里,您可以看到file1结尾处有换行符,而结尾file2没有。

现在假设我有一个file

$ cat file
Hello
Welcome to
Unix
$

我想and Linux在文件末尾添加,然后echo " and Linux" >> file将其添加到换行符。但我要最后一行Unix and Linux

因此,为了变通,我想在文件末尾删除换行符。因此,如何删除文件末尾的换行符?


6
不要删除它,只需使用文本编辑器即可。sed '$s/$/ and linux/'
2013年

Answers:


27

如果您只想在最后一行添加文本,则使用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

9
删除尾随换行符的更好方法perl -pi -e 'chomp if eof' myfile。相比于truncate或者dd它不会把你一个破碎的文件,如果myfile有确实没有尾随换行符。
Hi-Angel

2
我可以推荐@ Hi-Angel作为答案吗?我认为这将是一个很好的答案。
西蒙·佛斯伯格

@SimonForsberg谢谢,完成了
Hi-Angel

17

不过,您可以通过tr -d '\n'以下方式从line中删除换行符:

$ 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
  2. truncate -s -1 file

    来自man truncate

    -s, --size=SIZE
              set or adjust the file size by SIZE

    SIZE is an integer and optional unit (example: 10M is 10*1024*1024).
    Units are K, M, G, T, P, E, Z, Y (powers of 1024) or KB, MB, ... (powers of 1000).
    
    SIZE  may  also be prefixed by one of the following modifying characters: 
    '+' extend by, '-' reduce by, '<' at most, '>' at least, '/' round down to multiple of, '%' round up to multiple of.

head -c -1 file | tee file安全的吗?tee开始之前是否会截断文件?
iruvar

1
@ 1_CR确实。管道的两侧平行开始,这取决于谁赢得比赛。由于tee仅需打开文件,而head必须读取和写入文件的内容,tee因此除了有时很小的文件之外,实际上将赢得比赛。
吉尔斯(Gillles)“所以-不要再邪恶了”

2
这不会删除最后一个换行符,而是会删除所有换行符。IMO有很大的不同。
Hi-Angel

8

您可以使用perl实现以下目的:

perl -pi -e 'chomp if eof' myfile

相比于truncatedd本不会把你一个破碎的文件,如果myfile有确实没有尾随换行符。

(答案是根据注释构建,并基于此答案


谢谢!这种有条件的删除方法是尾随换行符是完美的。
xer0x

2

这是一种sed-在文件的最后($)行上,搜索并替换所有内容(.*)的方式为“匹配的所有内容”,后跟“和Linux”:

sed '$s/\(.*\)/\1 and Linux/' file

Isaac提供的一种更简单的解决方案是:

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

这将用给定的文本替换(符号)行尾。


以撒,我喜欢这个建议!更简单/更明显。我将用它更新答案。谢谢!
杰夫·谢勒
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.