使用perl one liner进行多行匹配的问题

时间:2014-04-11 08:52:58

标签: regex perl

我正在尝试使用Perl one liner,以匹配多线模式。 我的文件" new"看起来像下面的东西。

foo
bar
foo1
bar1
go

bye
bar2

意图是匹配前四行,即foo和bar1之间的行。

我的一个班轮如下:

perl -0777 -n -e 'm/^foo.+?bar1/s && print' new

我正在使用-0777整体阅读文件,而不是逐行阅读。另外,我已经使用/s修饰符来制作"。"匹配" \ n"也。但是这一个班轮没有达到目的。它匹配enitre文件。

我可能会遗漏一些非常基本的东西。 我能否得到专家的帮助,因为这长期以来让我感到很烦恼?

2 个答案:

答案 0 :(得分:1)

试试这个:

perl -0777 -n -e 'm/^(foo.+?bar1)/s && print $1' new

默认情况下,print将输出$_,并且该变量的值是您案例中的整个文件。

答案 1 :(得分:0)

另一种解决方案是使用范围..,同时仍然逐行处理文件:

perl -ne 'print if /^foo$/../^bar1$/' new

这可能无法完全按照您的意愿运作,因为

  1. 如果不存在foo,它将从bar1开始打印到文件末尾。
  2. 如果foobar1的范围不止一个,则会打印每个范围。