PERL:匹配多个模式

时间:2014-12-30 21:17:37

标签: regex perl

我有一个看起来像这样的文本块

 Log Message(500).
    'Time': 1412207847
    'Name': John
    'blah some text
    'blah 2': some text
    'Priority': 5
    'Header':   Oct  1 19:00:12 2014  
    'Message':  Multiple lines of text here

我正在尝试提取名称,标题和消息。我已经得到它来提取标题和消息,但我现在无法获得它以获得名称。

以下是我获取标题和消息的方法

   my ($header, $message) = /
                    ^ \s+ Log[ ]Message .* \n
                    \s+ 'Header': \s+ (\S.*) \n
                    \s+ 'Message': \s+ (\S.*) \n \n $
            /xms;

以下是我如何获得这个名字,但它不起作用。

my ($name, $header, $message) = /
                    ^ \s+ Log[ ]Message .* \n     # many lines
                    \s* 'Name': \s+ (\S.*) \n
                    \s+ 'Header': \s+ (\S.*) \n
                    \s+ 'Message': \s+ (\S.*) \n \n $
            /xms;
编辑:我想获得价值。所以我希望它返回

John
Oct  1 19:00:12 2014
Multiple lines of text here

1 个答案:

答案 0 :(得分:2)

一次读取整个文件:

$ perl -0ne '
    print $1, $2, $3, $4 if
        /
            \047 Name    \047:\s*(.*?\n).*?
            \047 Header  \047:\s*(.*?\n).*?
            \047 Message \047:\s*(.*)
        /sx
' file

或者使用命名的反向引用和HASH切片:

$ perl -0ne '
    print @+{qw/Name Header Message/} if 
    /
        \047 Name    \047:\s*(?<Name>    .*?\n).*?
        \047 Header  \047:\s*(?<Header>  .*?\n).*?
        \047 Message \047:\s*(?<Message> .*?\n)
    /sx
' file

输出:

John
Oct  1 19:00:12 2014  
Multiple lines of text here