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

时间:2017-12-27 11:26:03

标签: perl

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

perl -00 -pe ''

来自Perl One-Liners Explained

  

首先它没有任何代码,-e为空。接下来它有一个   silly -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

最右边0代表什么?

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

2 个答案:

答案 0 :(得分:6)

如有疑问,请阅读官方文档。请参阅perlrun中的-0perlvar中的$/

文字应该说

  

段落是两个或更多换行符的文字分隔

"所有其他换行符"然后成为不成对出现的新线。 "忽略"意味着他们不会分开段落,但它们包含在从输入中读取的字符串中。

-e0只执行0作为代码。 0和1免于warnings,任何其他值也可以使用,但-w会警告您:

Useless use of a constant (2) in void context at -e line 1.

要实现您想要的功能,您可以分两步处理文件:首先,从空白行中删除任何空格

perl -lpe 's/^\s+$//'

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

然后运行已知的

perl -00pe0

因此,整个管道变为

perl -lpe 's/^\s+$//' -- file | perl -00pe0

当然,您可以通过一次致电perl来完成所有工作:

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

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

答案 1 :(得分:1)

B::Deparse模块 可用于揭示单行程序背后的有效代码。 可以通过添加-MO=Deparse这样的

来启用它
perl -MO=Deparse -00 -p -e 0

-0选项设置$/的值:输入记录分隔符,并使用""将其设置为空字符串-00 “段落模式”,表示输入将在一个或多个空行处分割

-0的另一个特殊值是-0777,它会禁用记录分隔符,以便读取整个文件。并且$/可以设置为\<number>,例如\8192,以便输入具有固定长度的记录,但这不能通过-0选项

如果文件不是太长,请阅读整个文件

perl -0777 -pe 's/\n\s+\n/\n\n/g'

否则,文件可以用例如8192字节的块读取,但在某些情况下,必须在处理之前读取下一个块。

perl -pe 'BEGIN { $/ = \8192} $_ .= <> while /\n\s*$/ && ! eof; s/\n\s+\n/\n\n/g'