仅当空白行后面跟着非空白行时才删除空行...应删除一行中的多个空白行

时间:2012-02-05 00:35:21

标签: lines

我有一个基本上是地址形式的txt文件,如下所示:

John Smith
123 Address Way
Blah Blah Blah

每个文本块后跟3个空行(我想要的)。但是,文件中的某些地址缺少数据,因此它们是空白的,如下所示:

John Smith
123 Address Way

Blah Blah Blah

我希望在每个数据后保留多个(3)空行,但我只想删除单个空白行。

有人有什么想法吗?我发现谷歌上的所有内容都与删除多个空白行或所有空白行相关......与我需要的相反。

1 个答案:

答案 0 :(得分:1)

如果你遇到其中一个问题,并且文件不是很大,那么这个工作的最佳工具之一就是undef $/模式下的perl,这使得它将整个文件作为一个大字符串读取;这使您可以像任何其他角色一样匹配\n

在字符级别,假设任何行上没有尾随水平空格,空白行是两行换行符;两个空白行是三个换行符,依此类推。要删除空行,请删除两个换行符之一。现在,如果你只是写s/\n\n/\n/g,那将会比你想要的更多,因为\n\n会在更长的换行符中匹配新行对。因此,您需要一个匹配连续两个换行符的构造,但只有它们之前或之后没有更多换行符。这是look-around assertions的用途。

perl -pe 'BEGIN { undef $/ } s/\s+$//mg; s/(?<!\n)\n\n(?!\n)/\n/sg'

应该做的工作。它的副作用是从文件的每一行删除尾随空格(如果有的话)。如果要删除双空行以及单个空白行(但仍然不是三行空白行),则只需调整第二个RE的中间位置:

perl -pe 'BEGIN { undef $/ } s/\s+$//mg; s/(?<!\n)\n{2,3}(?!\n)/\n/sg'