通配符匹配

时间:2019-02-13 05:45:24

标签: regex perl

我需要匹配一个包含通配符\和的句子。用同一句话。如何使用Perl?

假设我的文件中包含以下句子:

ttterfasghti.
ddseghies/affag
hhail/afgsh.
asfsdgagh/
adterhjc/sgsagh.

我的预期输出应该是:

hhail/afgsh.
adterhjc/sgsagh.

2 个答案:

答案 0 :(得分:3)

这感觉像是重复的,但是我为此找不到一个很好的先前问题。

对于/,有两种方法:

  • 使用m//运算符使用不同的分隔符,例如m,<regex with />,m{<regex with />}
  • 转义它,即/\//

对于.,请使用转义。

请注意,在字符类([...])中,许多特殊字符不再需要转义。

因此我们得到:

$ perl <dummy.txt -ne 'print "$1: $_" if m,(\w+/\w*\.),'
hhail/afgsh.: hhail/afgsh.
adterhjc/sgsagh.: adterhjc/sgsagh.

即如果该行包含一个或多个单词字符,然后是/,零个或多个单词字符,并以.结尾,则会打印该行。

推荐阅读perlrequickperlretutperlre


OP在评论中阐明了要求后,

更新

 $ perl <dummy.txt -ne 'print if m,/, && m{\.}'
 hhail/afgsh.
 adterhjc/sgsagh.

答案 1 :(得分:3)

从评论中澄清

  

任何订单,但匹配行应同时包含/.

一种简单的方法

perl -wne'print if m{/} and m{\.}' filename

这是低效的,因为它会两次启动正则表达式引擎并扫描每个字符串两次。但是,在大多数情况下这是不明显的,尽管此代码比该任务的单个正则表达式更清晰。

我使用{}分隔符是为了不必逃脱/,在这种情况下,前面的m是强制性的。然后,为了保持一致性,我在另一个模式上使用了相同的m{...}


最令人欢迎的询问是,此操作以脚本而不是单行代码完成!很高兴履行义务。

use warnings;
use strict;

my $file = shift || die "Usage: $0 file\n";

open my $fh, '<', $file or die "Can't open $file: $!";

while (<$fh>) {
    print if m{/} and m{\.};
}

close $fh;