gpt4 book ai didi

regex - Perl - 不能删除空行

转载 作者:行者123 更新时间:2023-12-02 08:39:14 25 4
gpt4 key购买 nike

比方说,我有一个这样的文件(它不是实际内容而是 hexdump):

0000000  \r  \n  \r  \n   T   h   i   s       i   s       a       f   i
0000010 l e \r \n \r \n H e r
0000020 e ' s s o m e t e x t \r \n
000002f

如果我运行以下命令:

#!/usr/bin/perl
use strict;
use warnings;
use File::Slurp;
$_ = read_file("file.txt");

s/^\s*$//mg;
print;

产生的输出是:

0000000  \n   T   h   i   s       i   s       a       f   i   l   e  \r
0000010 \n \n H e r e ' s s o m e t e
0000020 x t \r \n

显然,空行没有被删除。

谁能指出我做错了什么?

最佳答案

在正则表达式中,$ 断言可能有点令人困惑。根据文档,它“匹配 [es] 行尾(或末尾换行符之前)”。所以它的行为大致像

(?=\n\z)|\z

使用 /m 修饰符,这会变为

(?=\n)|\z

这意味着 \n 不包含在匹配的子字符串中。你想要:

s/^\s*\n//mg;

现在您的代码中仍有一些问题需要解决。主要是,一次读入整个文件并在其上运行正则表达式毫无意义。相反,我会这样做:

use strict; use warnings; use autodie;

open my $fh, "<", "file.txt";
while (<$fh>) {
print if /\S/; # print if this line contains at least one non-space character
# this elegantly skips whitespace-only lines.
}

这假定行尾完全由空白字符组成并以 \n 结尾。这适用于 \r\n\n 行尾。否则,分配自定义行尾,如

local $/ = local $\ = "\r\n"; # input and output line endings
while (<$fh>) {
chomp; # remove line endings
print if /\S/; # print adds the line ending again.
}

关于regex - Perl - 不能删除空行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18102670/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com