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'
                         ]
        };
说明:

  • -MData::Dumper
    使用Data::Dumper模块。这只是为了演示,与您的问题无关
  • -00
    使用段落模式,这意味着-简单地说-将输入记录分隔符设置为
    \n\n
    ,以便在双换行上拆分输入
  • -a
    以空格分隔段落。您可以使用
    -F'\n'
    对其进行限定,使其仅在换行符上拆分
  • -n
    隐式
    while()
    循环程序
  • -l
    在本例中不是严格要求的,但它可以方便地为您处理换行符结尾
  • @F
    是autosplit选项使用的数组。意思是我们把段落中的第一个词作为标题,其余的词作为论点

不错!JSON::XS
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'
                         ]
        };