如何在perl中进行mutiline的模式匹配

时间:2016-04-15 06:34:37

标签: perl pattern-matching

我正在尝试在其值参数扩展到多行的行上进行模式匹配。我的输入文件看起来像

输入文件内容

$ npm install cookie-parser -g

脚本输出:: config -type cc -opt“XX”-value {“A”\

我希望我的print命令返回整个配置行,而不是将其返回到“A”。看起来当前的模式匹配命令还不够。

config -type "cc" -opt "XX" -value { "A" \   
                                     "B" \
                                     "C" }\                                                                                                                                              -default "A" \
                    -text "\tA: XX size = 1/1\
\tB  : XX size = 1/10\
\tC : XX size = 1/100" -active dev

and the script to read the file is 

#!/usr/bin/env perl
use strict();
use warnings();
use Cwd;

my $custom=$ARGV[0];
 ##pattern matching
open(my $fNew, "< $custom") or die "cannot open $!";
while(<$fNew>) {
  ##Pattern matching
  if( $_ =~ m/^\s*config\s+-type\s+([^\s+]+)\s+-opt\s+\"([^\"]+)\".*/gi ) {
   ##print the pattern
    print "$_\n";
  }
}

2 个答案:

答案 0 :(得分:2)

我没有意识到输入文件及其格式中所有可能的数据块组合。如果我误解了,请告诉我。

考虑您的文件有格式

someblock1 -option1 value -option2 value
someblock2 -option1 value -option2 value
...
config -option1 value -option2 value
...
someblockN -option1 value -option2 value

您希望使用多行模式获取所有config - 块到标量变量。由于此块可能包含换行符。

这是一些没有循环的任务代码:

use strict;
use warnings;

open  my $fh, '<file' or die "$!\n"; my $file = join '', <$fh>; close $fh;
$file =~ /config.*?-value\s?\{.*?"(\w)"\s*\}.*?\1\s?:.*?(?:\n|$)/s;
print $&;

此模式将与D : XX size = 1/100" -active dev选项中指向的-value{...}之类的描述匹配。 (当然,如果您在生成文件时遵循某些顺序)

答案 1 :(得分:0)

RegExp命令下面应该匹配

  

/ ^ \ s * -temp [\ s * {} \“[a-z] +] * / gim

使用在线regexp教练进行测试

http://regexr.com/v1/