2

正規表現一致テキストのすぐ内側に置換を適用したいログがあります。

例として、次のログ行を取り上げます。

date machine  text random text and yet more random text - status code

ログ内の他のすべてのスペースを置き換えずに、テキスト領域内のすべてのスペースを _ に置き換えたい。出力は次のようになります。

date machine  text_random_text_and_yet_more_random_text - status code

置き換えたい領域に一致させるには、次の正規表現を使用します。

/machine \(.*\) - /

テキストは標準的ではないため、1 つのスペースから 20 までのスペースを使用できるため、直接一致させるのは難しいため、部分文字列の開始と終了を一致させます。

それを使用しようとして、私はこれを試しました:

sed `/machine \(.*\) - /   s/ /_/g '  logfile

もちろん、一致した部分文字列だけでなく、ログ内のすべてのスペースが置き換えられます。

が見つかるまで各フィールドを繰り返して印刷することにより、awkでなんとかそれを行うことがmachineできOFS="_"ました-. それは機能します...それでも、sedを使用してこれを解決できるかどうか興味がありました。

ありがとう

4

5 に答える 5

1

これはうまくいくかもしれません(GNU sed):

sed -r 's/(\S+\s+){2}/&\n/;s/\s+-/\n&/;h;y/ /_/;G;s/.*\n(.*)\n.*\n(.*)\n.*\n/\2\1/' file
于 2013-10-10T19:57:28.260 に答える
1

アンダースコアとスペースを使用したいテキストの前に2つのスペースがあるため、次のようにすることができます:

awk -F "  | - " '/machine/ {gsub(/ /,"_",$2)}1' file
date machine text_random_text_and_yet_more_random_text status code
于 2013-10-10T19:47:09.960 に答える
0

パール:

echo "date machine  text random text and yet more random text - status code" | 
perl -pe 's/(?<=machine  )(.*)(?= - )/ ($repl = $1) =~ s{\s}{_}g; $repl /e'
date machine  text_random_text_and_yet_more_random_text - status code
于 2013-10-10T20:28:46.923 に答える
0

別の awk ソリューションは次のとおりです。

awk '{
    # Capture the stringpart in `a`rray
    match($0,"machine  (.*) -",a)
    # Make the changes
    gsub(" ","_",a[1])
    print gensub("machine (.*) -","machine  " a[1] " -","g")
}' INPUTFILE
于 2013-10-10T19:48:48.493 に答える