从文件中删除尾随换行符
Contents
1. 概述
由于各种原因,尾随换行符可能最终出现在我们的文件中,例如保存发出额外换行符的错误命令的输出。在本教程中,我们将学习如何从文件中删除尾随换行符。
2. 删除单个尾随换行符
让我们看看用于从文件中删除单个尾随换行符的命令。
在下面的示例中,我们使用wc -l 命令来计算换行符的数量。
2.1. 使用perl
首先,让我们检查示例文件的内容:
$ cat bad.txt
one newline
$ wc -l bad.txt
1 bad.txt
在这里,wc -l输出1因为文件包含单个尾随换行符。
现在,如果它是换行符,我们可以使用perl的chomp函数删除最后一个字符:
$ perl -p -i -e 'chomp if eof' bad.txt
$ wc -l bad.txt
0 bad.txt
如我们所见,wc -l在删除尾随换行符后输出0 。我们使用*-p标志打印输出,使用-i标志将输出写入文件,而-e*允许我们将 Perl 代码作为参数传递。
** if eof语句表明该字符是最后一个字符,即在文件末尾。这种方法非常有效,因为我们只调用了一个perl命令。**
2.2. 使用head和tail
我们可以使用 tail 命令测试最后一个字符是否为换行符,然后使用head 命令将其删除:
$ cat bad.txt
one newline
$ wc -l bad.txt
1 bad.txt
$ if [ "$(tail -c 1 bad.txt | wc -l)" = 1 ]; then head -c -1 bad.txt > tmp; mv tmp bad.txt; fi
$ wc -l bad.txt
0 bad.txt
这里,wc -l的输出与前面的示例类似。-c 1标志获取文件的最后一个字符。我们通过管道将此字符输入wc以检查它是否是换行符。如果是,我们使用head -c -1打印除最后一个字符之外的整个文件,从而删除换行符。
此方法使用临时文件并用它覆盖原始文件。因此,它比使用perl 的方法效率低,因为我们调用了两个命令而不是一个。
3. 删除所有尾随换行符
我们可以从文件中删除所有尾随换行符,而不是仅仅删除最后一个尾随换行符。
首先,让我们看一下文件内容:
$ cat bad.txt
many newlines
$ wc -l bad.txt
4 bad.txt
在这里,wc -l输出4因为文件包含四个尾随换行符。
我们可以使用 Bash 的内置printf 命令来删除尾随的换行符:
$ printf "%s" "$(< bad.txt)" > tmp
$ mv tmp bad.txt
$ wc -l bad.txt
0 bad.txt
我们可以看到wc -l在删除尾随换行符后输出0 。我们使用*$(<)运算符将文件加载到内存中并将其传递给printf*。Bash 在读取文件时会自动去除尾随的换行符。