0

「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/ ;

}
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 に答える