0

我正在尝试检查“5:16:51:209|INFO|”之后的消息是否以“标记”开头。我需要在 timstamp 之后添加字符串“|ICD”。

输入是:“05:16:51:209|INFO|Markerprocedure Magnet”

我试过这个正则表达式,但它不起作用。请帮我把它弄对。

if ( $lines[$i] =~ m/(\d{2}:\d{2}:\d{2}:\d{3})|(\w+)|^Marker/)
{

  $lines[$i] =~ s/(\d{2}:\d{2}:\d{2}:\d{3})(.*)/$1|ICD$2/ ;

}
4

1 回答 1

2
I am trying to check if message after "5:16:51:209|INFO| " starts with "Marker"

在我看来,您要检查的是是否Marker 紧随其后 5:16:51:209|INFO|,因此使用正则表达式字符是不正确的,^因为它会检查字符串的开头是否出现在该位置(当然,它没有t)。所以删除这个^字符,Perl 会检查是否Marker紧跟在后面。

此外,您需要|像这样转义字符:\|以防止它被视为正则表达式中的替代命令。然后您可以在单个替换命令中进行测试和替换:

if ( $lines[$i] =~ s/(\d{2}:\d{2}:\d{2}:\d{3})(\|\w+\|Marker)/$1|ICD$2/ )
{
    # Line contained "Marker" and "|ICD" inserted
}

例子:

$ echo '15:16:51:209|INFO|Marker blah' | perl -ple 's/(\d{2}:\d{2}:\d{2}:\d{3})(\|\w+\|Marker)/$1|ICD$2/'

输出是:

15:16:51:209|ICD|INFO|Marker blah

编辑:@Prix 在评论中指出,如果时间戳应该出现在字符串的开头,那么^开始标记应该在正则表达式的开头,以防止字符串其他部分的意外匹配(和性能):

 s/^(\d{2}:\d{2}:\d{2}:\d{3})(\|\w+\|Marker)/$1|ICD$2/
   ↑
   Use ^ here to anchor the search to the beginning of the string. 
于 2013-08-05T04:24:36.730 回答