0

生のテキスト データからバルク エントリ ファイルをフォーマットする必要がありました。を使用してソリューションの大部分を達成することができましたSed. 次の入力[はるかに大量の]を解析しようとしてブランチに夢中になったときに、問題が明らかになりました。

---- Start Product ----
PartNumber>> 123457
Size04_Req>> 2 
Size02_Req>> 1 
PartColor>> Natural
PartDescription>> Guys Tee 
---- End Product ----
---- Start Product ----
PartNumber>> TPIOO9205
Size05_Req>> 1 
PartColor>> Natural
PartDescription>> Black Hoodie


---- End Product ----


###...with the objective of achieving the following output:


---- Start Product ---
PartNumber>> 123457
Size01_Req>> 0 
Size03_Req>> 0 
Size05_Req>> 0 
Size06_Req>> 0
Size04_Req>> 2 
Size02_Req>> 1 
PartColor>> Natural
PartDescription>> Guys Tee
---- End Product ----
---- Start Product ----
PartNumber>> TPIOO9205
Size01_Req>> 0 
Size02_Req>> 0 
Size03_Req>> 0 
Size04_Req>> 0 
Size06_Req>> 0
Size05_Req>> 1 
PartColor>> Natural
PartDescription>> Black Hoodie
---- End Product ----

これは、アドレス範囲/----\ Start\ Product\ ----/,/----\ End\ Product\ ----/内で作業し、いくつかのエレガントなブランチを実行するのと同じくらい簡単だと思います:label 作業ですが、明らかに、私の傾向は、このロジックのために Awk などにジャンプすることです。しかし、セドと一緒にいたいという当初の願望に固執し、いつでも新しいセドのトリックを学びたいので、これをどのように行うことができますか? ロジックは、 説明されていないサイズ 01-06 に対してSizeXX_Req>> 0を挿入することであり、順序は重要ではないことに注意してください. 少なくとも 1 つのSizeXX_Reqが常に存在します。各 Start/End Product セクションの間に行を挿入します。Sed(i) マスターはこれを素早く処理できますか? 最近書いている正規表現のボートロードから抜け出し、簡単な修正を見逃しているだけですか?

どうぞ。あなたがどのように(またはなぜ)したかを説明することさえせずに、別のランド言語で私を見せてください。私もそれでダウンしています. 前もってありがとう、のぞき見。

4

1 に答える 1

0

カウンターとある種のバックリファレンスが必要なため、sedだけを使用してこれを行うことは私には不可能に思えます。とにかく、Perlを使用しているのは間違っているかもしれません。

use warnings;
use strict;

my (%sizes, %part);
while(<>) {
  if (/^---- End Product ----/) {
    print "---- Start Product ----\n";
    print "PartNumber>> $part{Number}\n";
    for my $size (map { sprintf "%02d", $_ } 1..6) {
      if (not defined $sizes{$size}) {
        print "<b>Size${size}_Req>> 0</b>\n";
      }   
    }   
    for my $size (keys %sizes) {
      print "Size${size}_Req>> $sizes{$size}\n";
    }   
    print "Part$_>> $part{$_}\n" for ("Color", "Description");
    print "---- End Product ----\n";
    %sizes = (); 
    %part  = (); 
  }
  $sizes{$1} = $2 if (/^Size(\d+)_Req>>\s*(\d+)/);
  $part{$1} = $2 if (/^Part(\w+)>> (.*)/);
}

使用する

perl script.pl input

出力

---- Start Product ----
PartNumber>> 123457
<b>Size01_Req>> 0</b>
<b>Size03_Req>> 0</b>
<b>Size05_Req>> 0</b>
<b>Size06_Req>> 0</b>
Size04_Req>> 2
Size02_Req>> 1
PartColor>> Natural
PartDescription>> Guys Tee 
---- End Product ----
---- Start Product ----
PartNumber>> TPIOO9205
<b>Size01_Req>> 0</b>
<b>Size02_Req>> 0</b>
<b>Size03_Req>> 0</b>
<b>Size04_Req>> 0</b>
<b>Size06_Req>> 0</b>
Size05_Req>> 1
PartColor>> Natural
PartDescription>> Black Hoodie
---- End Product ----
于 2013-03-20T02:23:52.303 に答える