在文件中只需要1个尾随换行符

时间:2016-09-16 22:16:41

标签: perl unix awk sed

我有各种各样的文件混合使用尾随新行。没有回车,只有\n。某些文件有多个换行符,有些文件没有尾随换行符。我想编辑文件。

如何编辑文件以准确显示1个尾随换行符?

4 个答案:

答案 0 :(得分:4)

要就地更改文本文件以使其只有一个尾随换行符:

 sed -zi 's/\n*$/\n/'

这需要GNU sed。

-z告诉sed使用NUL字符作为分隔符读取文件。由于文本文件没有NUL字符,因此可以立即读取整个文件。

-i告诉GNU sed更改文件。

s/\n*$/\n/告诉sed使用一个换行符替换文件末尾的许多新行。

答案 1 :(得分:3)

用一个替换所有尾随新行?

$text =~ s/\n+$/\n/;

这使文件最后留下一个换行符 - 如果它至少有一个开头的话。如果您希望它在那里,即使文件没有,请将\n+替换为\n*

对于就地规范,暗示一行:

perl -i -0777 -wpe 's/\n+$/\n/' file.txt

Command Switches in perlrun中解释了开关的含义。

这是开关的摘要。请参阅上述文档以获得准确的解释。

  • -i更改文件"到位。"请注意,数据仍然被复制并使用临时文件

  • -0777读取整个文件。 -0[oct|hex]$/设置为数字,以便-0

  • -w使用warnigs。与use warnings不完全相同,但总比没有好

  • -p ''中的代码依次在每行文件上运行,如-n,然后打印$_

  • -e ''之间的内容作为Perl代码执行 -E是相同的,但也启用了feature,例如say

请注意,我们可以使用核心OB::Deparse模块来查看等效代码

perl -MO=Deparse -wp -e 1

打印

BEGIN { $^W = 1; }
LINE: while (defined($_ = <ARGV>)) {
    '???';
}
continue {
    print $_;
}
-e syntax OK

显示与-w-p

一条线条相当的脚本。

答案 2 :(得分:1)

perl -i -0 -pe 's/\n\n*$/\n/' input-file

答案 3 :(得分:1)

到目前为止发布的解决方案将您的整个输入文件读入内存,如果您的文件很大,这将是一个问题。这只会将连续的空行读入内存:

awk -i inplace '/./{printf "%s", buf; buf=""; print; next} {buf = buf $0 ORS}' file

以上使用GNU awk进行就地编辑。