Perl 检查字符串是否以给定字符串开头
我试图检查“5:16:51:209 | INFO |”之后的消息是否以“Marker”开头。我需要在timstamp后面添加字符串“| ICD” 输入为:“05:16:51:209 |信息|标记程序磁铁” 我试过这个正则表达式,但它不起作用。请帮我把它弄对Perl 检查字符串是否以给定字符串开头,perl,Perl,我试图检查“5:16:51:209 | INFO |”之后的消息是否以“Marker”开头。我需要在timstamp后面添加字符串“| ICD” 输入为:“05:16:51:209 |信息|标记程序磁铁” 我试过这个正则表达式,但它不起作用。请帮我把它弄对 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$
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/ ;
}
在我看来,您试图检查的是标记是否紧跟在5:16:51:209 | INFO |
之后,因此使用^
正则表达式字符是不正确的,因为它会检查字符串的开头是否出现在该位置(当然,它不会出现)。因此,删除^
字符,Perl将检查标记是否紧跟其后
另外,您需要像这样转义\\\\\\\
字符,以防止它在正则表达式中被视为交替命令。然后,您可以在单个替换命令中执行测试和替换:
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
Edit:@Prix在评论中指出,如果时间戳要出现在字符串的开头,那么^
开始标记应该出现在正则表达式的开头,以防止字符串的其他部分意外匹配(以及性能):
实际上,使用<代码> ^ < /代码>是正确的。然而,他在错误的地方使用它,应该在开始<代码> /^ < /代码>,因为他可能不想找到其他类似于在字符串中间的时间戳的其他东西。应该没有^
。但我同意,在实践中,匹配很可能只发生在字符串的开头,因此我将编辑我的答案。是的,这是正确的,但我基于他提供的样本输入,该样本输入以时间戳开头,希望OP将其清除。同样根据他的示例字符串,在初始数字之前也有一个空格。如果字符串的开头有空格,那么我将把它留给OP来决定应该对正则表达式做什么来解释它。因为这是一个与问题的主要目的无关的次要问题,所以我觉得回答得如此详细就太难了。
15:16:51:209|ICD|INFO|Marker blah
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.