如何在Perl中的grep之后在匹配的大括号之间提取字符串?

时间:2016-02-03 09:48:59

标签: regex string bash perl pattern-matching

我有一个下面提到的文字格式的文件: cat test.txt

"perl-Test::DNS" : [
         {
            "environment" : "test1",
            "hash" : "c8d149b4fc895b214276ca5c90d1181e",
            "identifier" : "test1-Test::DNS",
         },
         {
            "environment" : "Test2",
            "hash" : "c8d149b4fc895b214276ca5c90d1181e",
            "identifier" : "test2-Test::DNS",
         },
         {
            "environment" : "Test3",
            "hash" : "c8d149b4fc895b214276ca5c90d1181e",
            "identifier" : "test3-Test::DNS",
         },
]

"perl-Test::SSH" : [
         {
            "environment" : "test1",
            "hash" : "c8d149b4fc895b214276ca5c90d1181e",
            "identifier" : "test1-Test::SSH",
         },
         {
            "environment" : "Test2",
            "hash" : "c8d149b4fc895b214276ca5c90d1181e",
            "identifier" : "test2-Test::SSH",
         },
         {
            "environment" : "Test3",
            "hash" : "c8d149b4fc895b214276ca5c90d1181e",
            "identifier" : "test3-Test::SSH",
         },
],

我需要grep特定的字符串,即“perl-Test :: SSH:[”来自文件,并打印/提取该字符串的'['和']'之间的整行。

我在这里找到了类似的问题:Perl: How to extract a string between brackets但这个链接只提取两个括号之间的单词,我需要提取行。

任何有效的东西都会被接受,但解释会有很大帮助。

1 个答案:

答案 0 :(得分:0)

你可以做支架捕捉,但是当你不必要时它会很乱。 (JSONXML稍微容易处理,但它仍然不是一个好主意。

然而,看起来它可能是YAML - 它非常接近 - 我只需要从你的来源中删除一个尾随的逗号,我假设是因为你给了我们您的配置示例。

加载YAML看起来有点像这样:

#!/usr/bin/env perl

use strict;
use warnings;
use Data::Dumper;

use YAML::XS; 

my $yaml = Load ( do { local $/; <DATA> } );
print Dumper $yaml -> {"perl-Test::DNS"};


__DATA__
"perl-Test::DNS" : [
         {
            "environment" : "test1",
            "hash" : "c8d149b4fc895b214276ca5c90d1181e",
            "identifier" : "test1-Test::DNS",
         },
         {
            "environment" : "Test2",
            "hash" : "c8d149b4fc895b214276ca5c90d1181e",
            "identifier" : "test2-Test::DNS",
         },
         {
            "environment" : "Test3",
            "hash" : "c8d149b4fc895b214276ca5c90d1181e",
            "identifier" : "test3-Test::DNS",
         },
]

"perl-Test::SSH" : [
         {
            "environment" : "test1",
            "hash" : "c8d149b4fc895b214276ca5c90d1181e",
            "identifier" : "test1-Test::SSH",
         },
         {
            "environment" : "Test2",
            "hash" : "c8d149b4fc895b214276ca5c90d1181e",
            "identifier" : "test2-Test::SSH",
         },
         {
            "environment" : "Test3",
            "hash" : "c8d149b4fc895b214276ca5c90d1181e",
            "identifier" : "test3-Test::SSH",
         },
]

正如您所看到的 - 它正确地解析了您的文件,而不是那个尾随的逗号。 (如果您之后有其他条目,那也会有效)。以上输出:

$VAR1 = [
          {
            'environment' => 'test1',
            'hash' => 'c8d149b4fc895b214276ca5c90d1181e',
            'identifier' => 'test1-Test::DNS'
          },
          {
            'hash' => 'c8d149b4fc895b214276ca5c90d1181e',
            'environment' => 'Test2',
            'identifier' => 'test2-Test::DNS'
          },
          {
            'hash' => 'c8d149b4fc895b214276ca5c90d1181e',
            'environment' => 'Test3',
            'identifier' => 'test3-Test::DNS'
          }
        ];

但这是一个正常的&#39;您可以根据需要遍历的perl数据结构。