SED - 1 つ以上の一致が見つかった場合の新しい行の作成

SED - 1 つ以上の一致が見つかった場合の新しい行の作成

私のフォルダにいくつかのファイルがあります。

各ファイルの構造は次のとおりです。

...
infos: '{"NAME":"Product","CLASSES":[255,107,255,108,255,255,0,0,255,255,255,255,255],"ISSALE":0,"CATEG":54}'
warehouse: 123
color: black
...

次のシナリオを完了する必要があります。シングルSEDコマンドの使用, *.txt を使用するすべてのファイルで

2つのうちの1つが発生した場合にのみ、新しい行を作成するだけです。 2つの条件が一致した場合は、1行だけを生成する必要があります。

状況:

情報: {...xxxx...."CATEG":54} または リポジトリ: 123

PS:行番号によってファイルが変更される可能性があるため、行番号はありません。 PS2:「CLASSES」は以下のようにファイルあたりのサイズを変更できるので、{}の中にCATEGがどこにあるのかわかりません。

カテゴリマッチ - 1行作成

...
infos: '{"NAME":"Product","CLASSES":[255,107,255,108,255,255,0,0,255,255,255,255,255],"ISSALE":0,"CATEG":54}'
warehouse: 000
NEW LINE
color: black
...

リポジトリの一致 - 1行

...
infos: '{"NAME":"Product","CLASSES":[255,107,255,108,255,255,0,0,255,255,255,255,255],"ISSALE":0,"CATEG":00}'
warehouse: 123
NEW LINE
color: black
...

CATEGとリポジトリの一致 - 1行

...
infos: '{"NAME":"Product","CLASSES":[255,107,255,108,255,255,0,0,255,255,255,255,255],"ISSALE":0,"CATEG":54}'
warehouse: 123
NEW LINE
color: black
...

一致しない - 生成された行がありません。

...
infos: '{"NAME":"Product","CLASSES":[255,107,255,108,255,255,0,0,255,255,255,255,255],"ISSALE":0,"CATEG":00}'
warehouse: 000
color: black
...

ベストアンサー1

私はそれがsedデータの構造を理解していないことを知っていると確信していますjson。知っているのは、改行文字、文字列、正規表現を選択および/または変更することだけです。

したがって、間違えやすく、悪いことは、sedがずっと後で下流になるまで喜んで変更を加えるので、それを知らないかもしれません。

注意事項に加えて、次の方法を試すことでこの問題を解決できます。POSIXライ sed:

sed -e '

  $!N

  /^infos:.*\nwarehouse:/! {
    P
    D
  }

  /"CATEG":[1-9]/! {
    /\nwarehouse: *[1-9]/! b
  }

  G

' file

またGNU sed、インストールした場合(通常は名前gsed)、|OR演算子を使用して最適化できます。

sed -E '$!N
  /^infos:|\nwarehouse:/!{P;D;}
  /("CATEG":|^warehouse:\s*)[1-9]/MG
' file

仮定:

  • 情報ラインと倉庫ラインが隣接しています。
  • CATEG キーは infos キー行にあります。

おすすめ記事