我有一个格式为
的文件 location:
rome
participants:
cesar
pompei
Sylla
我正在尝试调用perl
来获取给定键的值,例如我的参数participants
的函数将返回
cesar
pompei
Sylla
我面临的问题是,如果没有选项-n
,似乎我的正则表达式都不起作用。
例如我期待
> perl -e '/(.*)/ms && print "$1\n" ' input.txt
打印整个文档。
答案 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