Regex 使用perl-e匹配多行
我有一个格式相同的文件Regex 使用perl-e匹配多行,regex,perl,Regex,Perl,我有一个格式相同的文件 location: rome participants: cesar pompei Sylla 我试图调用perl来获取给定键的值,例如,带有参数参与者的函数将返回 cesar pompei Sylla 我面临的问题是,如果没有选项-n,我的正则表达式似乎都不起作用。 比如说我在期待 > perl -e '/(.*)/ms && print "$1\n" ' input.txt 要打印整个文档。如果不使用-n,则必须明确读取
location:
rome
participants:
cesar
pompei
Sylla
我试图调用perl
来获取给定键的值,例如,带有参数参与者的函数将返回
cesar
pompei
Sylla
我面临的问题是,如果没有选项-n
,我的正则表达式似乎都不起作用。
比如说我在期待
> perl -e '/(.*)/ms && print "$1\n" ' input.txt
要打印整个文档。如果不使用-n,则必须明确读取输入,例如
while(<>){do...}
while(){do…}
你没有得到匹配,因为你实际上没有从stdin中阅读任何内容。测试了以下内容:
# cat file
location:
rome
participants:
cesar
pompei
Sylla
现在获取参与者
:
# perl -e 'undef $/; $_=<>; /participants:\s*(.*?)(\n\n|$)/s && print "$1\n";' file
cesar
pompei
Sylla
#perl-e'unde$/;$"/参与者:\s*(.*)(\n\n |$)/s&&print“$1\n”文件
塞萨尔
庞贝
塞拉
UPD:正如TLP所提到的,它可以用-0开关重写:
# perl -0777 -e '$_=<>; /participants:\s*(.*?)(\n\n|$)/s && print "$1\n";' file
cesar
pompei
Sylla
#perl-0777-e'$#/参与者:\s*(.*)(\n\n |$)/s&&print“$1\n”文件
塞萨尔
庞贝
塞拉
默认情况下,-n
和-p
将一次一行地向单行脚本提供输入。因此,要使用多行搜索,您必须告诉perl
使用不同的记录分隔符。为此,请使用-0
选项
要在一行中读取整个文件,请执行以下操作:
perl -0777 -ne '...' input.txt
要使用“段落模式”(在两行或多行连续换行上拆分,这可能是解决此问题所需的):
在命令行中,您也可以使用段落模式:
perl -MData::Dumper -00 -anlwe
'$h=shift @F; $a{$h}=[@F]; }{ print Dumper \%a;' ceasar.txt
输出:
$VAR1 = {
'participants:' => [
'cesar',
'pompei',
'Sylla'
],
'location:' => [
'rome'
]
};
说明:
使用Data::Dumper模块。这只是为了演示,与您的问题无关-MData::Dumper
使用段落模式,这意味着-简单地说-将输入记录分隔符设置为-00
,以便在双换行上拆分输入\n\n
以空格分隔段落。您可以使用-a
对其进行限定,使其仅在换行符上拆分-F'\n'
隐式-n
循环程序while()
在本例中不是严格要求的,但它可以方便地为您处理换行符结尾-l
是autosplit选项使用的数组。意思是我们把段落中的第一个词作为标题,其余的词作为论点@F
perl-MJSON::XS-00-anlwe'$h=shift@F$a{$h}=[@F];}{$coder=JSON::XS->new->ascii->pretty->allow\u nonref;print$coder->encode(\%a);“
非常感谢您对命令行开关的解释!那么a
是一个表的关联数组吗?非常强大…@UmNyobe它是一个散列,以标题作为键,以名称作为值的数组。一旦您解析了输入,您就可以轻松访问任何一个标题。是的,但我已经知道while()
,我不想使用它。非常感谢你的回答!!我将修改后面的正则表达式组(\n\n |$)
,它太严格了。ps:请在你发布时详细说明-0777:),这就是我要找的。
$VAR1 = {
'participants:' => [
'cesar',
'pompei',
'Sylla'
],
'location:' => [
'rome'
]
};