我有一个文件,我需要重新格式化并删除“额外”空行。
我正在使用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
答案 0 :(得分:29)
更换
^(\s*\r\n){2,}
使用
\r\n
是我最终的结果。
这只选择两行或更多倍的空行,并用一个替换它们。
答案 1 :(得分:19)
这取决于行结尾。假设\ n,替换它:
([ \t]*\n){3,}
\n\n
。
答案 2 :(得分:3)
在Vim中,使用
:%!cat -s
我发现这是迄今为止删除额外空行的最简单方法。
答案 3 :(得分:3)
试试这个perl oneliner perl -00pe0
,如果你想进行编辑,只需添加-i
选项
答案 4 :(得分:2)
更换
\n\s*\n\s*
带
\n\n
应该做的伎俩
答案 5 :(得分:2)
为了完整性,我想在这里引用UltraEdit用户论坛中的大帖子Remove / delete blank and empty lines,它在新手的所有解释之后包含了用于减少两行或多行(空行)的解决方案空白(空行)到一行空行,与行终止符类型无关。
关于艾伦摩尔在答案中所写的一些话:
UltraEdit的Perl正则表达式支持不受其基于行的架构的影响。 Perl正则表达式引擎有一个标志,用于确定一个点是否匹配除换行符(如回车符(CR)和换行符(LF)之外的所有字符)或所有字符(包括CR和LF)。如果将文本文件解释为大字节流或Perl正则表达式查找/替换的行序列,则会产生差异。在UltraEdit中,默认情况下将标志设置为在正则表达式搜索字符串中不包括\r
(CR)和\n
(LF)。但是,可以通过启动带有(?s)
的正则表达式字符串在UltraEdit中轻松更改此行为,该字符串更改标记match_not_dot_newline
的值,如在主题"." in Perl regular expressions doesn't include CRLFs?的UltraEdit用户论坛中发布的那样
Perl正则表达式替换为
的文件工作作为line ending,在段落末尾可选择尾随空格和制表符(一行或多行),并且段落下方有两行或多行(空行)或空格(空白行)可以完成搜索字符串\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和found行结尾。如果段落下面有两个或多个空行或空行,则段落末尾的现有尾随空格和下一行的空格也可能被此正则表达式替换掉。
如果在段落末尾修剪空格并且在运行此Perl正则表达式替换时也应该在下一个空行或空白行上完成,则可以在搜索字符串中用{2,}
替换 +
。但请注意,在这种情况下,如果段落末尾没有尾随空格而下一行是空行,则替换会替换不会发生任何变化的内容。
答案 6 :(得分:0)
我不确定UltraEdit是什么让你在“替换”区域中逃脱,但是如果你不能使用换行符(我以前遇到过这个问题)但是可以使用捕获引用,这可能有效:
Find : \s*(\r\n)\s*(\r\n)\s*\r\n
Replace : $1$2
未经过广泛测试,但似乎对您提供的样本有效。
答案 7 :(得分:0)
请参阅this thread了解导致问题的原因。据我所知,UltraEdit正则表达式在字符级别(即在一行内)是贪婪的,但在行级别上是非贪婪的(粗略地说)。我无法访问UE,但我会尝试编写正则表达式,因此它必须匹配在最后一个空白行后的具体内容。例如:
search: (\r\n[ \t]*){2,}(\S)
replace: $1$2
这匹配并捕获行分隔符的两个或多个实例以及它后面的任何水平空格,但它只保留最后一个。 \S
应强制它保持匹配,直到找到至少包含一个非空白字符的行。
我承认我对这个解决方案没有很大的信心; UltraEdit的正则表达式支持因其基于行的架构而瘫痪。如果你想要一个正则表达式正确的编辑器,并且你不想学习一个全新的正则表达式语法(比如vim),那就得到EditPadPro。
答案 8 :(得分:0)
还可以使用空白处的空格
答案 9 :(得分:0)
在我的 Intellij IDE 上搜索\n\n
的内容并将其替换为\n