我有一个下面提到的文字格式的文件: 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但这个链接只提取两个括号之间的单词,我需要提取行。
任何有效的东西都会被接受,但解释会有很大帮助。
答案 0 :(得分:0)
你可以做支架捕捉,但是当你不必要时它会很乱。 (JSON
比XML
稍微容易处理,但它仍然不是一个好主意。
然而,看起来它可能是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数据结构。