私のフォルダにいくつかのファイルがあります。
各ファイルの構造は次のとおりです。
...
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 キー行にあります。