我有一个基本上是地址形式的txt文件,如下所示:
John Smith
123 Address Way
Blah Blah Blah
每个文本块后跟3个空行(我想要的)。但是,文件中的某些地址缺少数据,因此它们是空白的,如下所示:
John Smith
123 Address Way
Blah Blah Blah
我希望在每个数据后保留多个(3)空行,但我只想删除单个空白行。
有人有什么想法吗?我发现谷歌上的所有内容都与删除多个空白行或所有空白行相关......与我需要的相反。
答案 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'