我有一个数据文件,内容如下:
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