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

vnzz0bqm  于 2022-11-15  发布在  Perl
关注(0)|答案(2)|浏览(157)

我有一个包含以下内容的数据文件。

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变量的一些变体。我如何让它工作呢?
我有另一个包含以下内容的数据文件:

Showing 1 - 46 of 46 products
20
50
per page

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

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

不同的是数字在“显示”下面,而对于不起作用的数字在上面。

4uqofj5v

4uqofj5v1#

尝试的regex看起来不错,尽管我会避免使用双引号(因此需要转义!)。

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

然后

$text =~ s/$re//;

结果是所需的两行。整个文件在字符串$text中。
我已经在该模式中到处添加了可能的空格,但是由于\s主要包括各种形式的新行,因此您可能只能保留\s+

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

(我在第一个模式中留下了显式的\n,以避免混淆。)
文件中的新行可能有问题,比如回车和换行符对(而不仅仅是一个换行符),所以如果这不起作用,试着调整模式中的\n
可以选择使用[\n\r]+(换行和回车中的一个或两个),或者\R(Unicode换行符),或者\v(垂直空格)。或者\s+,相当于[\h\v]。请参见上面的perlrecharclass链接。

qlvxas9a

qlvxas9a2#

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

#!/usr/bin/env perl
use strict;
use warnings;
use v5.32;

while (my $line = <>) {
    next if $line =~ m/\A\d+\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

相关问题