30

我有一个文件需要重新格式化并删除“额外”的空白行。

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

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

当前所有文本

替换为以下所有内容:


2011 年冬季课程表

2011 年冬季课程注册日期:2010 年 12 月 6 日 - 2011 年 1 月 1 日
2011 年冬季课程日期:2011 年 1 月 5 日至 2 月 12 日

舞蹈

芭蕾与踢踏历险记      
3 – 6 年 教练:Ann Newby
3 至 6 岁的幼儿在探索运动的基本要素时会发展出更强的节奏感、灵活性和协调性。
周六 9 点 - 10 点 1 月 8 日 - 2 月 12 日 六周费用:30 美元


非洲讲故事
3 – 6 年 教练:Ann Newby
3 至 6 岁的幼儿通过口语、音乐、动作和视觉艺术体验探索讲故事和寓言故事。
周六 10 点至 11 点 1 月 8 日至 2 月 12 日 六周费用:30 美元


非洲舞蹈 / 儿童

你会注意到一些双空行有空格或制表符或两者都有。

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

当前所有文本

替换为以下所有内容:

2011 年冬季课程表

2011 年冬季课程注册日期:2010 年 12 月 6 日 - 2011 年 1 月 1 日
2011 年冬季课程日期:2011 年 1 月 5 日至 2 月 12 日

舞蹈

芭蕾与踢踏历险记      
3 – 6 年 教练:Ann Newby
3 至 6 岁的幼儿在探索运动的基本要素时会发展出更强的节奏感、灵活性和协调性。
周六 9 点 - 10 点 1 月 8 日 - 2 月 12 日 六周费用:30 美元

非洲讲故事
3 – 6 年 教练:Ann Newby
3 至 6 岁的幼儿通过口语、音乐、动作和视觉艺术体验探索讲故事和寓言故事。
周六 10 点至 11 点 1 月 8 日至 2 月 12 日 六周费用:30 美元

非洲舞蹈 / 儿童
4

10 回答 10

40

更换

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

\r\n

是我最终的结果。

这只会选择两个或多个倍数的空白行并用一个替换它们。

于 2010-12-17T23:27:03.787 回答
21

这取决于行尾是什么。假设 \n,替换这个:

([ \t]*\n){3,}

\n\n.

于 2010-12-17T21:54:42.363 回答
5

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

于 2014-01-21T03:48:36.510 回答
4

更换

\n\s*\n\s* 

\n\n

应该做的伎俩

于 2010-12-17T22:04:24.340 回答
4

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

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

UltraEdit 的 Perl 正则表达式支持不受其基于行的体系结构的影响。Perl 正则表达式引擎有一个标志,用于确定点是否匹配除换行符(如回车符(CR)和换行符(LF)之外的所有字符,或者实际上是所有字符,包括 CR 和 LF)。如果文本文件被解释为大字节流或 Perl 正则表达式查找/替换的行序列,这会有所不同。在 UltraEdit 中,该标志默认设置为不包括正则表达式搜索字符串中的点\r(CR) 和(LF)。\n但是这种行为可以很容易地在 UltraEdit 中通过启动正则表达式字符串(?s)来更改标志的值,match_not_dot_newline如在 UltraEdit 用户论坛中发布的主题“。” 在 Perl 正则表达式中不包括 CRLF?

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 和 found 行结尾。如果段落下方有两个或多个空行或空白行,则此正则表达式替换也可能会删除段落末尾现有的尾随空格和下一行的空格。

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

于 2014-01-21T06:56:00.007 回答
3

在 Vim 中,使用

:%!cat -s

我发现这是迄今为止删除多余空行的最简单方法。

于 2012-11-21T04:59:19.380 回答
0

我不确定 UltraEdit 可以让您在“替换”区域中摆脱什么,但如果您不能使用换行符(我以前遇到过这个问题)但可以使用捕获引用,这可能会起作用:

Find    : \s*(\r\n)\s*(\r\n)\s*\r\n
Replace : $1$2

未经广泛测试,但似乎适用于您提供的示例。

于 2010-12-17T22:06:24.980 回答
0

请参阅此线程以了解导致问题的原因。据我了解,UltraEdit 正则表达式在字符级别(即在一行内)是贪婪的,但在行级别是非贪婪的(粗略地说)。我无权访问 UE,但我会尝试编写正则表达式,因此它必须在最后一个空白行之后匹配具体的内容。例如:

search:   (\r\n[ \t]*){2,}(\S)
replace:  $1$2

这匹配并捕获了行分隔符的两个或多个实例以及它后面的任何水平空白,但它只保留最后一个。应该强制它继续匹配,\S直到找到至少有一个非空白字符的行。

我承认我对这个解决方案没有很大的信心。UltraEdit 的正则表达式支持因其基于行的架构而受到削弱。如果您想要一个正确执行正则表达式的编辑器,并且您不想学习全新的正则表达式语法(如 vim),请获取EditPadPro

于 2010-12-18T04:47:16.160 回答
0

也应该在空行上使用空格

  • 搜索 - /\n^\s*\n/
  • 替换 - \n\n
于 2011-08-26T18:00:46.797 回答
0

在我的Intellij IDE上搜索的内容\n\n并将其替换为\n

于 2018-03-24T13:34:06.417 回答