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.