2016-09-16 42 views
2

我有多种使用尾随新行的方式的文件组合。没有回车,只有\n。有些文件有多个换行符,有些文件没有结尾换行符。我想编辑文件。在文件中只需要1个尾随换行符

如何编辑这些文件以确切地有1个尾随换行符?

+0

没有任何UNIX工具可以进行真正的“就地”编辑,它们都会创建一个临时文件(或者'ed'的内部缓冲区)并用它覆盖原始文件。那是问题吗? –

+0

不,临时文件只要透明即可。我不想处理备份文件。 – Joe

回答

4

要更改文本文件中,地方有一个且只有一个换行符:

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

这需要GNU sed的。

-z告诉sed使用NUL字符作为分隔符读入文件。由于文本文件没有NUL字符,因此这会导致一次读取整个文件。

-i告诉GNU sed更改文件。

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

+0

但是,如果文件末尾没有\ n,则不会添加一个 – harmic

+1

@harmic是的,它会。由于'\ n *'匹配_zero_或更多换行符,因此即使没有任何内容存在,该命令也会添加一行。是什么让你说呢? – John1024

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 S,像say

注意,我们可以通过使用核心OB::Deparse模块看到的等效代码作为

perl -MO=Deparse -wp -e 1 

这将打印

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

表示脚本相当于一个衬垫与-w-p

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

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

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

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