我正在尝试检查“5:16:51:209 | INFO |”之后的消息是否以“Marker”开头。我需要在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/ ;
}
答案 0 :(得分:2)
I am trying to check if message after "5:16:51:209|INFO| " starts with "Marker"
我试图检查的是Marker
是否紧跟 5:16:51:209|INFO|
,因此使用^
正则表达式是不正确的字符,因为它检查字符串的开头是否发生在该位置(当然,它没有)。因此,删除^
字符,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.