2017-04-08 23 views
0

私はサーバにpingして結果を返すプログラムを使用しています。テキスト形式の結果データは、私が必要とするCSVとは正反対です。私は正規表現でひどいです、そして、これは私にはこのデータを平坦化することは非常に複雑であるようです。データを正規表現で平滑化

データは、正規表現

1.2. 3. 4 | Min | Avg | Max |Std.Dev|Reliab%| 
    ----------------+-------+-------+-------+-------+-------+ 
    + Cached Name | 0.000 | 0.000 | 0.000 | 0.000 | 100.0 | 
    + Uncached Name | 0.040 | 0.100 | 0.250 | 0.065 | 100.0 | 
    + DotCom Lookup | 0.049 | 0.121 | 0.182 | 0.040 | 100.0 | 
    ---<-------->---+-------+-------+-------+-------+-------+ 
        sub.domain.com 
       Some Provider, LLC 

    5.6. 7. 8 | Min | Avg | Max |Std.Dev|Reliab%| 
    ----------------+-------+-------+-------+-------+-------+ 
    + Cached Name | 0.000 | 0.000 | 0.000 | 0.000 | 100.0 | 
    + Uncached Name | 0.040 | 0.100 | 0.250 | 0.065 | 100.0 | 
    + DotCom Lookup | 0.049 | 0.121 | 0.182 | 0.040 | 100.0 | 
    ---<-------->---+-------+-------+-------+-------+-------+ 
        bus.domain2.net 
       Some Other Provider, Inc 

ので、ここで

に、私は正規表現を使用して抽出しようとしてんだよ前に//
Domain,Company,IP,Cached Name Min,Cached Name Max,Cached Name Avg,Cached Name Std.Dev,Cached Name Reliab%,IP,Uncached Name Min,Uncached Name Max,Uncached Name Avg,Uncached Name Std.Dev,Uncached Name Reliab%,IP,Cached Name Min,Cached Name Max,Cached Name Avg,Cached Name Std.Dev,Cached Name Reliab%,IP,DotCom Lookup Min,DotCom Lookup Max,DotCom Lookup Avg,DotCom Lookup Std.Dev,DotCom Lookup Reliab% 
sub.domain.com,Some Provider - LLC,1.2.3.4,0.000,0.000,0.000,0.000,100.0,0.040,0.250,0.100,0.065,100.0,0.049,0.182,0.121,0.040,100 
bus.domain2.net,Some Other Provider - Inc,5.6.7.8,0.000,0.000,0.000,0.000,100.0,0.040,0.250,0.100,0.065,100.0,0.040,0.250,0.100,0.065,100.0,0.049,0.182,0.121,0.040,100.0 

は、正規表現のために、このユースケースは複雑すぎるのsedセド?誰も私がこれを達成する方法を手がかりがありますか?

+0

"複合"を定義する方法によって異なります。確かに実行可能ですが、それは長い正規表現になります。 – Vallentin

+1

[Doable、yes。それはすべきか?確かにそうではありません。](https://regex101.com/r/tdCtpR/1/) – Vallentin

答えて

2

これにsedを使用することは最良の選択ではないかもしれませんが、場合によってはその考えを無効にすることもあります。

だからここsedのソリューションです: "1.2.3.4" に沿っため

sed -En "s/^\s*([[:digit:]]+\.)\s*([[:digit:]]+\.)\s*([[:digit:]]+\.)\s*([[:digit:]]+)\s*\|.*$/\1\2\3\4\,/;T;{N;N;N;N;s/\n[^|]+\|//g;s/ \| /,/g;s/ \|//;x;N;z;N;N;s/,/ -/g;G;s/\n\s*/,/g;s/^,//;p}" input.txt 
  • 見て、IPは、
    試してみることがT;{
  • は(「」またはによって置き換える)次の数行を取得し、削除し、成功した場合に次の行に
    s/^\s*([[:digit:]]+\.)\s*([[:digit:]]+\.)\s*([[:digit:]]+\.)\s*([[:digit:]]+)\s*\|.*$/\1\2\3\4\,/;T;
  • を試してみてください失敗した場合、IPを抽出するために、不要なものをたくさん
    N;N;N;N;s/\n[^|]+\|//g;s/ \| /,/g;s/ \|//;
  • ホールドスペースにし、1次の行を無視ストアx;N;z;
  • N;N;s/,/ -/g;
  • 「」次の行に取得し、サニタイズ
  • がに保存されているものを追加適切な場所に(のみ) "" 取得するためにスペースG;
  • いくつかの化粧を保持s/\n\s*/,/g;s/^,//;
  • プリントと行わp}

出力:所望の出力と非常に似て

sub.domain.com,Some Provider - LLC,1.2.3.4, 0.000,0.000,0.000,0.000,100.0,0.040,0.100,0.250,0.065,100.0,0.049,0.121,0.182,0.040,100.0 
bus.domain2.net,Some Other Provider - Inc,5.6.7.8, 0.000,0.000,0.000,0.000,100.0,0.040,0.100,0.250,0.065,100.0,0.049,0.121,0.182,0.040,100.0 

、除きます1.2.3.4,の後ろに ""あります。
それは問題ですか?

(実際には、希望の出力がサンプル入力と一致するかどうか疑問があります。