Perl和Regex - 单线模式匹配

时间:2015-06-10 15:57:16

标签: regex string perl whitespace

为什么不

perl -ne "print if /(<Conn)([\S|\s]+?)(>)/sg;" /path/to/file

匹配

<Connector port="PORT" protocol="HTTP/1.1" SSLEnabled="true"
           maxThreads="150" scheme="https" secure="true"
           clientAuth="false" sslProtocol="TLS" />`

匹配时

<Connector port="PORT" protocol="AJP/1.3" redirectPort="PORT" />

我需要做些什么来匹配同一个正则表达式?

2 个答案:

答案 0 :(得分:1)

-n选项逐行读取文件,但您可以通过取消定义输入行终止符来更改整行文件的行。这是使用local $/;或使用命令行选项-0777完成的,如下所示:

perl -0777ne 'print "$1\n" while /(<Conn.+?>)/sg;' /path/to/file

它立即读入整个文件。如果这是一个问题,请尝试在命令行上将$/设置为>(因为您的模式始终以>结束)或-o076

perl -076ne 'print "$1\n" if /(<Conn.+?>)/sg;' /path/to/file

答案 1 :(得分:0)

因为它是按行运行的。在您的第一个数据上,$ _将采用三个单独的值

1

<Connector port="PORT" protocol="HTTP/1.1" SSLEnabled="true"

2

       maxThreads="150" scheme="https" secure="true"

3

       clientAuth="false" sslProtocol="TLS" />

并且这些都不会自己匹配。

如果你想让它匹配,也许你可以尝试啜饮整个文件。

my $whole_file = do { local $/; <> };