删除所有连续的空白行,只留下一行:perl -00 -pe''

rap*_*apt 0 perl

我尝试理解以下Perl命令"删除所有连续的空行,只留下一个":

perl -00 -pe ''
Run Code Online (Sandbox Code Playgroud)

Perl One-Liners解释:

首先它没有任何代码,-e是空的.接下来它有一个愚蠢的-00命令行选项.此命令行选项打开段落啜食模式.段落是两个换行符之间的文本.所有其他新行都被忽略了.段落放在"$ _"中," - p"选项将其打印出来.

我不遵循这个解释.也许措辞不准确.

所以"A paragraph is text between two newlines."但每一行都是两个换行符之间的文本.

"All the other newlines get ignored." 但是,两个连续的换行之间没有换行符.

"The paragraph gets put in "$_" and the "-p" option prints it out."由于它是在每两个换行符之间的文本中进行的,因此将整个文件拼凑成一个长行.它看起来像这个命令应该怎么做?

它还说,另一种写它的方法是

perl -00pe0
Run Code Online (Sandbox Code Playgroud)

最右边的0代表什么?

无论如何,我实际想要实现的是删除所有连续的白线,只留下一条空行.白线我指的是一条可能不是空的行,但只有空白字符(和换行符).是否可以修改上述命令以匹配此情况?

cho*_*oba 6

如有疑问,最好阅读官方文档.见-0perlrun$/perlvar.

该文应该说

段落是由两个或多个换行符分隔的文本.

"所有其他新行"然后成为不成对出现的新行."忽略"表示它们不分隔段落,但它们包含在从输入中读取的字符串中.

-e0只是0作为代码执行.0和1免于警告,任何其他值也可以工作,但-w会警告你:

Useless use of a constant (2) in void context at -e line 1.
Run Code Online (Sandbox Code Playgroud)

要实现所需,您可以分两步处理文件:首先,从仅空白行中删除任何空格

perl -lpe 's/^\s+$//'
Run Code Online (Sandbox Code Playgroud)

(-l不需要与所有空格一起删除换行符).

然后运行已知的

perl -00pe0
Run Code Online (Sandbox Code Playgroud)

所以,整个管道变成了

perl -lpe 's/^\s+$//' -- file | perl -00pe0
Run Code Online (Sandbox Code Playgroud)

当然,您可以通过以下方式完成所有工作perl:

perl -ne 'if (/\S/)         { $in_sep = ! print }
          elsif (! $in_sep) { $in_sep = print "\n" }' -- file
Run Code Online (Sandbox Code Playgroud)

$ in_sep会记住我们是否"在分隔符中",只有当我们第一次输入这样的空格块时才会打印换行符.