使用perl -e匹配多行

时间:2012-11-13 18:28:01

标签: regex perl

我有一个格式为

的文件
 location:
 rome

 participants:
 cesar
 pompei
 Sylla

我正在尝试调用perl来获取给定键的值,例如我的参数participants的函数将返回

 cesar
 pompei
 Sylla

我面临的问题是,如果没有选项-n,似乎我的正则表达式都不起作用。 例如我期待

> perl -e '/(.*)/ms && print "$1\n" ' input.txt

打印整个文档。

4 个答案:

答案 0 :(得分:4)

在命令行中,您也可以使用段落模式:

perl -MData::Dumper -00 -anlwe 
    '$h=shift @F; $a{$h}=[@F]; }{ print Dumper \%a;' ceasar.txt

<强>输出:

$VAR1 = {
          'participants:' => [
                               'cesar',
                               'pompei',
                               'Sylla'
                             ],
          'location:' => [
                           'rome'
                         ]
        };

说明:

  • -MData::Dumper使用Data :: Dumper模块。这仅用于演示,与您的问题无关。
  • -00使用段落模式,这意味着 - 简单地说 - 将输入记录分隔符设置为\n\n,以便输入在双换行符上拆分。
  • -a在空白处拆分段落。您可以使用-F'\n'对此进行限定,以使其仅在换行符上进行拆分。
  • -n隐式while (<>)循环程序。
  • -l对于此示例并非严格要求,但它可以方便地为您处理换行符。
  • @F是autosplit选项使用的数组。这意味着我们将段落中的第一个单词作为标题,将其余单词作为标题。

答案 1 :(得分:2)

默认情况下,-n-p会一次一行地为您的单行脚本提供输入。因此,要使用多行搜索,您必须告诉perl使用不同的记录分隔符。使用-0选项。

要在一行中读取整个文件:

perl -0777 -ne '...' input.txt

使用“段落模式”(拆分两个或多个连续换行符,这可能就是你想要解决的问题):

perl -00 -ne '...' input.txt

答案 2 :(得分:1)

如果您不使用-n,则必须明确阅读输入,例如

while(<>){do...}

你没有得到匹配,因为你实际上并没有从stdin读取任何内容。

答案 3 :(得分:1)

测试了这个alitle:

# cat file
location:
rome

participants:
cesar
pompei
Sylla

现在获取participants

# perl -e 'undef $/; $_=<>; /participants:\s*(.*?)(\n\n|$)/s && print "$1\n";' file
cesar
pompei
Sylla

UPD:如TLP所述,它可以用-0开关重写:

# perl -0777 -e '$_=<>; /participants:\s*(.*?)(\n\n|$)/s && print "$1\n";' file
cesar
pompei
Sylla