我需要匹配一个包含通配符\和的句子。用同一句话。如何使用Perl?
假设我的文件中包含以下句子:
ttterfasghti.
ddseghies/affag
hhail/afgsh.
asfsdgagh/
adterhjc/sgsagh.
我的预期输出应该是:
hhail/afgsh.
adterhjc/sgsagh.
答案 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.
即如果该行包含一个或多个单词字符,然后是/
,零个或多个单词字符,并以.
结尾,则会打印该行。
推荐阅读perlrequick,perlretut和perlre。
更新:
$ 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;