Perl -如何用正则表达式删除多行数字



我有一个数据文件,内容如下:

Some random text here
1
2
3
13
Show:
120
items per page

我想删除数字,"Show:"和下面的数字。结果就变成了

Some random text here
items per page

我有以下代码:

my $Showing = "((\d{1,}\n))*Show:\n\d{1,}\n";
$FileContents =~ s/$Showing//ig;

,结果如下:

Some random text here
1
2
3
items per page

它只删除了"Show:"上面的一个数字,我已经尝试了一些$显示变量的变化。我怎样才能使它工作呢?

我有另一个数据文件,内容如下:

Showing 1 - 46 of 46 products
20
50
per page

有了代码,这段代码就可以工作了。

my $Showing = 'Showing.*n((\d{1,}\n)*)';
$FileContents =~ s/$Showing//ig;

不同之处在于数字在"显示"下面,而对于不工作的数字在上面。

尝试的regex看起来没问题,即使我要避免双引号(因此需要转义!)更好的是,使用qr操作符先构建正则表达式模式

my $re = qr/(?:[0-9]+s*ns*)+Show:s*ns*[0-9]+s*n/;

然后

$text =~ s/$re//;

生成所需的两行。整个文件在字符串$text.

我已经将这种模式与可能的空格分散在各处,但是由于s主要包括各种新行,您可能只留下s+

my $re = qr/(?:[0-9]+s+)+Show:s+[0-9]+s+/;

(为了避免混淆,我在第一个模式中留下了显式的n)

有可能出了"问题"。使用文件中的新行,例如使用回车和换行对(而不仅仅是换行符)。因此,如果这不起作用,请尝试调整模式中的n

选项使用[nr]+(换行和回车中的一个或两个),或R(Unicode换行符),或v(垂直空格)。或者s+,等价于[hv]。参见上面的perlrecharclass链接。

我可以通过多个正则表达式来解决这个问题。例如

#!/usr/bin/env perl
use strict;
use warnings;
use v5.32;
while (my $line = <>) {
next if $line =~ m/Ad+s*z/xms;
next if $line =~ m/AShow:s*z/xms;

print $line;
}

在Shell中像

$ ./remover.pl data.txt 
Some random text here
items per page

相关内容

  • 没有找到相关文章

最新更新