2016-06-25 14 views
0

jsonオブジェクトを削除する必要があるjsonファイルがあります。 は、sedコマンドでのみ削除する方法はありません。 サンプルファイルは以下のとおりです。JsonファイルからJsonファイルを削除するには、BASHのsedコマンドで

{ 
     "name": "ABC", 
     "description": "XYZ", 
     "versions": { 

     }, 
     "json_class": "Chef::Environment", 
     "chef_type": "environment", 
     "default_attributes": { 

     }, 
     "override_attributes": { 
      "company": { 
      "xyz": { 
        "mailer":{ 
     "smtp_host": "Some IP", 
     "imap_host": "Some Host", 
    "imap_user": "Some UserId", 
    "reply_to": "Some User Id", 
    "outbound_user": "", 
    "imap_mail_domain": "compute.oraclecloud.com", 
    "imap_password": ""}, 

        "logicaldomainname": "" 
         } 
         } 
     } 
    } 

このファイルでは、sedコマンドでmailerオブジェクトをファイルから削除します。 sedコマンドで可能であれば、どうぞ教えてください。

この削除の主な目的は、このオブジェクトを新しい メーラオブジェクトに置き換えることです。 次回、別のメーラーオブジェクトが投稿されるときにxyz jsonオブジェクトに追加するよりも遅くなります。

予想される出力:

{ 
     "name": "ABC", 
     "description": "", 
     "version": { 

     }, 
     "json_class": "Chef::Environment", 
     "chef_type": "environment", 
     "default_attributes": { 

     }, 
     "override_attributes": { 
      "Company": { 
      "XYZ": { 
        "logicaldomainname": "" 
         } 
         } 
     } 
    } 
+1

私たちのマシンでは、いくつかのライセンス条項のため実際には使用できません。しかしawkを使うことができます。 –

+3

'sed'は間違いなく適切です。 'jq'がオプションでない場合は、PerlやPythonの使用を考慮する必要があります:彼らは素晴らしいjsonライブラリを持っています。 –

+1

は期待される出力を加えました.. –

答えて

1
$ awk -v RS='^$' -v ORS= '{sub(/"mailer":[^}]+},[[:space:]]+/,"")}1' file 
{ 
     "name": "ABC", 
     "description": "", 
     "versions": { 

     }, 
     "json_class": "Chef::Environment", 
     "chef_type": "environment", 
     "default_attributes": { 

     }, 
     "override_attributes": { 
      "Company": { 
      "XYZ": { 
        "logicaldomainname": "" 
         } 
         } 
     } 
    } 

上記一度に記録1本のラインを構築し、ENDセクションでそれを処理したい他のawksで、マルチchar型のRS用のGNU AWKを使用しています:

$ awk -v ORS= '{rec=rec $0 RS} END{sub(/"mailer":[^}]+},[[:space:]]+/,"",rec); print rec}' file 
{ 
     "name": "ABC", 
     "description": "", 
     "versions": { 

     }, 
     "json_class": "Chef::Environment", 
     "chef_type": "environment", 
     "default_attributes": { 

     }, 
     "override_attributes": { 
      "Company": { 
      "XYZ": { 
        "logicaldomainname": "" 
         } 
         } 
     } 
    } 
+0

ありがとう@EDモートン、最初のものは私のためにうまくいきます。 –

+0

2番目の答えは期待される結果を出力しているようですが、元のファイルでは最初の回答が同じことをしている間は変化していません。 –

+1

よろしくお願いします。他に何が得られたのかを確認するには数時間を要し、その隣にあるチェックマークをクリックすることを決定した場合は、その時間を与えてください(http://stackoverflow.com/help/someone-answers参照)。 –

3

あなたは強くjqを禁止ライセンスの問題を解決する検討する必要があります。

を使用して
0

は:

sed '/\"mailer\"/,/}/ d; /^$/d' 1.a 

"(あなたの入力、1つを持っている)、すべての空白行を削除し、最初の}mailerから削除します"。 ( "インプレース")ファイルを上書きする

sed -i ... 

注:(あなたのように)複数行のファイルのための作品。

+1

誰かのユーザIDが 'mailer'の場合? – chepner

+0

誰かが新しいユーザ=を作成しなければならないでしょう。新しいデータベース... –

関連する問題