使用RegEx搜索和替换用一个空行替换多个空行

Art*_*Art 23 regex multiline ultraedit

我有一个文件,我需要重新格式化并删除"额外"空白行.

我正在使用Perl语法正则表达式搜索并替换UltraEdit的功能,并需要将正则表达式放入"查找内容:"字段中.

这是我需要重新格式化的文件示例.

All current text

REPLACE with all the following:


Winter 2011 Class Schedule 

Winter 2011 Class Registration Dates:  Dec. 6, 2010 – Jan. 1, 2011
Winter 2011 Class Session Dates:  Jan. 5 – Feb. 12, 2011

DANCE

Adventures in Ballet & Tap      
3 – 6 years Instructor:  Ann Newby
Tots ages 3 – 6 years old develop a greater sense of rhythm, flexibility and coordination as they explore the basic elements of movement.
Saturdays   9 - 10 a.m.     Jan. 8 – Feb. 12        Six-week fees:   $30 


African Storytelling
3 – 6 years Instructor:  Ann Newby
Tots ages 3 – 6 years old explore storytelling and fables through spoken word, music, movement and visual arts experiences.
Saturdays   10 – 11 a.m.    Jan. 8 – Feb. 12        Six-week fee:   $30


African Dance / Children

您会注意到一些双空行中有空格或制表符或两者都有.

搜索和替换运行后,我应该有一个看起来像这样的文件.

All current text

REPLACE with all the following:

Winter 2011 Class Schedule 

Winter 2011 Class Registration Dates:  Dec. 6, 2010 – Jan. 1, 2011
Winter 2011 Class Session Dates:  Jan. 5 – Feb. 12, 2011

DANCE

Adventures in Ballet & Tap      
3 – 6 years Instructor:  Ann Newby
Tots ages 3 – 6 years old develop a greater sense of rhythm, flexibility and coordination as they explore the basic elements of movement.
Saturdays   9 - 10 a.m.     Jan. 8 – Feb. 12        Six-week fees:   $30 

African Storytelling
3 – 6 years Instructor:  Ann Newby
Tots ages 3 – 6 years old explore storytelling and fables through spoken word, music, movement and visual arts experiences.
Saturdays   10 – 11 a.m.    Jan. 8 – Feb. 12        Six-week fee:   $30

African Dance / Children

Art*_*Art 32

更换

^(\s*\r\n){2,}

\r\n

是我最终得到的.

这仅选择两行或更多倍的空白行,并将其替换为一行.

  • 通过Google找到了这个答案,使用TextWrangler/BBEdit的以下修改过的字符串:`^(\ s*\r){2,}`被`\ r`替换.谢谢! (2认同)

Mar*_*ers 20

这取决于行结尾.假设\n,替换为:

([ \t]*\n){3,}
Run Code Online (Sandbox Code Playgroud)

\n\n.


Ask*_*arn 5

试试这个 perl oneliner perl -00pe0,如果你想就地编辑,只需添加-i选项


Mof*_*ofi 5

为了完整起见,我想在这里参考 UltraEdit 用户论坛中的大型帖子“删除/删除空白和空行”,该帖子在底部包含对新手的所有解释,即减少两行或多行而不包含任何内容(空行)或仅包含空格的解决方案(空行)到一个独立于行终止符类型的空行。

关于艾伦·摩尔在他的回答中所写的一些话:

UltraEdit 的 Perl 正则表达式支持并没有因其基于行的体系结构而受到削弱。Perl 正则表达式引擎有一个标志,用于确定点是否与除换行符(如回车符 (CR) 和换行符 (LF))之外的所有字符匹配,或者与包括 CR 和 LF 在内的所有字符匹配。如果文本文件被解释为大字节流或 Perl 正则表达式查找/替换的行序列,则会产生差异。在 UltraEdit 中,该标志默认设置为在正则表达式搜索字符串中不包含点\r(CR) 和(LF)。\n但这种行为可以在 UltraEdit 中轻松更改,方法是启动正则表达式字符串,该字符串会更改UltraEdit 用户论坛主题“.”(?s)中发布的标志值。Perl 正则表达式不包含 CRLF 吗?match_not_dot_newline

Perl 正则表达式将文件工作替换为

  • 回车 + 换行 (DOS/Windows) 或
  • 仅换行(Unix、Mac OS 10.0 及更高版本)或
  • 仅回车(Mac OS 9 及之前版本)

作为以可选尾随空格和制表符结尾的行(一行或多行),以及段落下方没有(空行)或空白(空行)的两行或更多行,可以使用搜索字符串和替换\h*(\r?\n|\r)(?:\h*\1){2,}\1\1完成细绳。

解释:

\h*根据 Unicode匹配任何水平空白字符0 次或多次。搜索表达式的第一部分匹配行尾的水平空白字符,例如水平制表符、普通空格、不间断空格和其他一些不常用的空格。

的使用 \s 不好,因为该字符类匹配任何空白字符,包括垂直空白字符回车符和换行符。

(\r?\n|\r)... 是一个OR表达式,在标记组中具有两个参数。第一个参数匹配换行符(可选)和前面的回车符,而第二个参数仅匹配回车符。所以这个表达式完全正确地匹配所有三种常见类型的线路终止。对于其余的搜索和替换来说,重要的是始终匹配CR+LF(两者一起) 仅 LF 仅 CR

(?:\h*\1)... 是一个非标记组,它匹配0 个或多个水平空格换行符,如使用 反向引用之前找到的那样\1,即CR+LF 仅 LF 仅 CR。所以这部分表达式找到一个空行或空白行。

{2,}...是非标记组中先前表达式的乘数,这意味着至少两倍。因此,段落结束后必须有两个或多个空行。段落下方只有一个空行不足以实现搜索表达式的正匹配。

替换字符串\1\1引用第一个找到的换行符的两次。

与此处发布的其他正则表达式相比,此正则表达式的优点是行结束类型必须未知。搜索表达式发现替换字符串中引用了 out 和找到的行结尾。如果段落下面有两个或多个空行或空白行,则此正则表达式替换可能也会删除段落末尾的现有尾随空格和下一行的空格。

{2,}如果在运行此 Perl 正则表达式替换时还应+修剪段落末尾和下一个空行或空行上的空格,则可以替换为 in 搜索字符串。但请注意,在这种情况下,如果段落末尾没有尾随空格并且下一行是空行,则替换将根本不会更改任何内容。

  • 很遗憾这个答案自 2014 年以来没有得到任何支持。 (2认同)