7

ログに記録されているサーバー間でファイル転送を行っています。これらは最終的にデータベースにアップロードする必要があるため、エラーをチェックするために前処理しています。各ログ ファイル エントリは転送を表しており、次の形式になっています。

key1=value1 key2=value2 

合計 16 フィールド。名前にスペースが含まれるファイルを誰かが転送した場合を除いて、ほとんどの転送は問題ありません。これは私の処理を台無しにします。なぜなら、私は perl スクリプトでスペースに対して split を呼び出すだけだからです。例:

DATE=20130411140806.384553 HOST=somehost PROG=someserver NL.EVNT=FTP_INFO START=20130411140806.384109 USER=someuser FILE=/extended_path/Wallpapers Folder.ico BUFFER=98720 BLOCK=262144 NBYTES=0 VOLUME=/ STREAMS=2 STRIPES=1 DEST=[0.0.0.0] TYPE=STOR CODE=226

これは、「Wallpapers」と「Folder.ico」の間にスペースがある一例です。それを説明し、それらすべてのキーと値のペアを分割できる正規表現を設計する方法はありますか? それを行う正規表現の方法がない場合、それを処理する他の方法を提案してもらえますか?

私の目的は、これらのスペースを何も置き換えない (つまり、スペースを削除する) またはアンダースコアに置き換えて、データベースにロードするスクリプトを実行するときに、単一のスペースで分割するだけで問題が発生しないようにすることです。ちなみに、私はこれらすべてを行うためにperlを使用しています。

4

1 に答える 1

11

キーの前にスペースがないことを保証する先読みを使用して、不要なスペースを検索できます。

$input =~ s/[ ](?!\S+=)/_/g;

=先読みは、次のスペース文字の前にないことを確認します。

次に、スペースで分割できます。

または、すぐに一致させるには、同様の手法を使用できます。

while ($input =~ m/(\S+)=((?:\S|[ ](?!\S+=))+)/g)
{
    # $1 is the key
    # $2 is the value
}

値については、スペース以外の文字またはキーの前にないスペースを繰り返します。

動作デモ。

キーが常に大文字の場合、\S+コード内のすべてを に置き換えることができます[A-Z]+

于 2013-07-02T13:16:48.997 に答える