2016-12-29 6 views
0

実際にどこが失敗しているのかわからないので、タイトルが正しくない可能性があります。 1つのディレクトリでbashスクリプトを実行しており、別のディレクトリから値が必要なJSONファイルがあります。外部ディレクトリの値を現在のディレクトリの同一のJSONファイルにコピーしたいとします。別のディレクトリからJQでjsonフィールドの値を取得してください

私は値をつかむためにJQを使用していますが、私は、スクリプトが実行されているもの以外のディレクトリからつかむ方法を見つけ出すことはできません。

を次のようにファイル構造の関連するビットであります;

cloudformation 
    - parameters_v13.json 
environment_files 
    - prepare_stack_files.json (the script this is run from) 
    - directory, changes based on where the script is pointed 
     - created directory where created files are being output 
     - GREPNAME_parameters.json 

興味のあるJSONファイルのチャンクは、このように見えます。

[ 
{ 
    "ParameterKey": "RTSMEMAIL", 
    "ParameterValue": "secretemail" 
    } 
] 

スクリプトはcloudformation/parameters_v13.jsonから「secretemail」を取得し、GREPNAME_parameters.jsonファイルに一致するRTSMEMAILフィールドに貼り付けする必要があります。

私は運がないと次のことを試みてきました。何も出力されませんでした。エラーメッセージも表示されず、ブランク出力のみです。 GREPNAMEのパスは正しいですが、別の場所で問題なく使用されているためです。

jq --arg email "$EMAIL" '(.[] | select(.ParameterKey == "RTSMEMAIL") | .ParameterValue) |= $email' ../cloudformation/parameters_v13.json | sponge ${GREPNAME}_parameters.json 
+0

あなたの入力は、検証可能ではありませんあなたは完全な 'json'やサンプルファイルを提供することができます。 – Inian

+0

右のように大括弧を入れて、完全なファイルを数えてください。 – Alex

+0

'' $ ja --arg email "$(。[] | select(.ParameterKey ==" RTSMEMAIL ")| .ParameterValue )| = $ email''、それは私に空白の出力を与えています。 – Inian

答えて

2

このjqフィルタを使用すると、secretmail文字列

jq '.[] | select(.ParameterKey=="RTSMEMAIL") | .ParameterValue' json 
"secretemail" 

値を引用符で囲むを削除するには、生の出力のための-rファイルを追加します

jq -r '.[] | select(.ParameterKey=="RTSMEMAIL") | .ParameterValue' json 
secretemail 

--raw-出力を得るのを助ける必要があります/ -r:

このオプションを使用すると、フィルタの結果が文字列の場合、引用符付きのJSON文字列としてフォーマットされるのではなく、標準出力に直接書き込まれます。これは、jqフィルターを非JSONベースのシステムと話す場合に便利です。

私は抽出のためにあなたがbash

email="RTSMEMAIL" 

で変数を設定することで、最初に何かを行うことができますし、今

としてフィルタに渡し、あなたは args jqに、フィルタを通過しようとしていることを見ることができたよう

parameters_v13.jsonファイルから取得した文字列をGREPNAME_parameters.jsonに置き換えるには、次の手順を実行します。 -

まず、最初のファイルの結果を変数に保存して後で再利用するために、このファイルを使用してjsonという名前を抽出しました。これは実際にparameters_v13.jsonファイルを別のパスに示します。

replacementValue=$(jq --arg email "$email" -r '.[] | select(.ParameterKey==$email) | .ParameterValue' json) 

$replacementValueは、あなたが別のファイルに更新したいsecretmailを開催します。先に指定した通り、GREPNAME_parameters.jsonの構文は最初のファイルと同じです。以下のような何か、

$ cat GREPNAME_parameters.json 
[ 
{ 
    "ParameterKey": "SOMEJUNK", 
    "ParameterValue": "somejunkvalue" 
    } 
] 

今、私はあなたの意図は、他のファイルから取得した値に上記のファイルから"ParameterValue"を置き換えであることを理解。それを達成するために、

jq --arg replace "$replacementValue" '.[] | .ParameterValue = $replace' GREPNAME_parameters.json 
{ 
    "ParameterKey": "SOMEJUNK", 
    "ParameterValue": "secretemail" 
} 

はその後、一時ファイルにこの出力を書き込むとGREPNAME_parameters.jsonとしてそれをバックに移動することができます。希望があなたの質問に答えることを望みます。

+0

私は答えを感謝しますが、実際に私の問題を解決することはありません。つまり、あるファイルから値を選択して別のファイルに移動しようとしています。それは問題の価値ではなく、進路です。 – Alex

+0

@Alex:この値を別のコマンドに供給したいのですか? – Inian

+0

簡単に言うと、 'parameters_v13.json'ファイルからGREPNAME_parameters.jsonファイルにシークレットメールをコピーしたいと思います。 – Alex

0

@Alex -

(1)spongeは単に一時ファイルを管理することなく、ファイルを変更するための便利な方法を提供します。

jq ........ input.json | sponge input.json 

ここで、「input.json」は「インプレース」で編集したいファイルです。入力ファイルを上書きしないようにするには、spongeを使用しないでください。実際には、あなたが望むことが絶対に確実になるまで、そうしないことを勧めます。

(2)jqを使って説明した内容を達成するための戦略がいくつかあります。基本的には、次の2つのカテゴリに分類されます。(a)jqを2回呼び出す。 (b)jqを1回呼び出す。

sponge一部を無視:

  • 次のように二倍になりJQ使用するためのパターン:あなたを想定し

    param=$(jq -r '.[] 
        | select(.ParameterKey == "RTSMEMAIL")|.ParameterValue 
        ' cloudformation/parameters_v13.json) 
    
    jq --arg param "$param" -f edit.jq input.json 
    
  • はJQ 1.5、ただ1回の呼び出しですべてを行うためのパターン持っていますjqの値は次のとおりです。

    jq --argfile p cloudformation/parameters_v13.json -f manage.jq input.json 
    

ここで、edit.jqとmanage.jqは適切なjqプログラムを含むファイルです。

要件の私の理解に基づいて、edit.jqは次のようになります。

(.[] | select(.ParameterKey == "RTSMEMAIL")|.ParameterValue) |= $param 

そしてmanage.jqを次のようになります場合にのみ

($p[] | select(.ParameterKey == "RTSMEMAIL")|.ParameterValue) as $param 
| (.[]| select(.ParameterKey == "RTSMEMAIL")|.ParameterValue) |= $param 
関連する問題