Perl命令行一行找到跨越多行的正则表达式匹配?

时间:2011-01-13 20:20:24

标签: perl

例如,我有一个包含

的文件foo.txt
abc
bcc
ccc
baa

我想返回“c \ nb”的所有实例的索引(在这种情况下,字符串是从文件的第三个和第十一个字符开始找到的)。实现这一目标的最简单方法是什么?

3 个答案:

答案 0 :(得分:4)

如果您确定该文件足够小以适应内存,您可以将其篡改为变量并应用正则表达式:

$ perl -0777 -ne 'print $-[0], "\n" while /c\nb/g' foo.txt

否则:

$ perl -ne 'print $n - 2, "\n" if /^b/ && $last =~ /c$/; $last = $_; $n += length' foo.txt

请注意,这些解决方案取决于仅包含ASCII字符的输入文件。

答案 1 :(得分:3)

#!/usr/bin/perl

my $s = 'abc
bcc
ccc
baa';

while ($s =~ /c\nb/mg ) {
  print pos($s), "\n"
}

这将输出5,13(pos函数返回匹配结束的索引,但你应该可以补偿它。)

答案 2 :(得分:1)

我确信这是一个不错的正则表达式解决方案,但我会回到较早的index函数:

$_ = q[abc
bcc
ccc
baa];

my $z; print $z++,"\n" while 0<=($z=index($_,"c\nb",$z));

<小时/>

2
10