为什么不
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" />
我需要做些什么来匹配同一个正则表达式?
答案 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 $/; <> };