2017-06-28 5 views
-3

ここに私の問題です:/amountC/ブロック/id="two"/に対応する2.0を抽出しようとします。ブロックは常に「amountC」を持っていますが、「amountA」を持っていない可能性があり、BまたはD正規表現:いくつかのブロック、可変数の行

は、だから私は、解析する必要があるでしょう:[any nb of cars or \n] bloc id="two" [any nb of cars or \n] amountC

(私はすでに数を解析する正規表現を持っている)

解析するデータの

exemple:

bloc id="one" { 
"amountA" : 10.98, 
"amountB" : 8.0, 
"amountC" : 9.0, 
"amountD" : 111.98 
}, 
bloc id="two" { 
"amountA" : 1.98, 
"amountC" : 2.0, 
"amountD" : 3.98 
} 
+0

ちょっと時間をかけて、エディタの書式設定機能を理解してください。たとえば、コードブロックは4つのスペースでインデントする必要があります(強調表示してCtrl + Kキーを押します)。そして、これは正規表現の仕事のようには見えません。 JSONパーサーがこれに適したツールだと思われます。 –

答えて

0

あなたは正規表現を使用しているコンテキストを説明していませんでした。コメントに記載されているように、コンテンツがJSONの場合は、おそらくJSONパーサーを使用する必要があります。しかし、あなたが聞いた文字通りの質問に答えようとします。

ほとんどのコンテキストでは、正規表現は複数のレコード(別名行)でうまく機能しません。コマンドラインから実行している場合は、awkまたはsedをフィルタとして使用できます。コンテンツを仮定すると、以下のように使用することができ、「コンテンツ」という名前のファイルにあった:

拡張正規表現をサポートして起動sed

sed -E '1,/bloc id="two"/ { /bloc id="two"/ ! d } 
     /.*"amountC" :/ { 
      s/.*"amountC" *: *([0-9\.]+).*$/\1/ 
      q 
     }' <content 
  1. をsedの。 bloc id="two"までのすべての行を削除します(同じ行に"amountC"がある場合)。
  2. 今、containsjngという行を探します。
  3. 数値の前後にあるすべての部分を削除します(この例では、有効な数値を厳密に解析する必要があります)。
  4. すでに"amountC"が発生していたため、完了しました。終了する。
  5. sedフィルターへの直接のコンテンツ。

AWK

awk 'BEGIN { Ignore=1 } 
    /bloc id="two"/ { Ignore=0 } 
    Ignore==1 { next } 
    /"amountC"/ { 
     print gensub(/.*"amountC" *: *([0-9\.]+).*/,"\\1") 
     quit 
    } 
    // { next }' content 
  1. 呼び出しawkと行を無視するフラグを初期化します。
  2. bloc id="two"が発生した場合は、「amountC」を探し始めます。
  3. 先頭行を無視します(bloc id="two"の前)。
  4. bloc id="two"が発生した場合は、「amountC」を探します。
  5. ターゲット行が見つかった場合は、その数値を出力します。
  6. ターゲットが見つかりました。完了しました。
  7. (ブロックを閉じる)
  8. 対象行でない場合は、次の行にスキップします。