「CTE_LG_LL_OE」の値を「警告」から「準備」に変更したいと思います。
{ "abcd": { "aav": "on", "vvg": "iio7890_APPID", "ct": "b-tte", "eSL": true, "it": "https://%ght%.mjk.com/", "tpo": "i-1", "pd": false, "pm": false, "pr": "" }, "en": { "CTE_LG_LL_OE": "warn", "S_G_EL_OD": "INFO", "G_LG_EL_OVE": "info" }, "EN_HTTPS": false }
次のコマンドを使用してファイル内の同じ内容を見つけることができますが、どのようにライナーコマンドに置き換えることができますか?
jq '.' /abc/temp/config.json | grep CTE_LG_LL_OE
答え1
到着得るキー値の場合は、JSON認識ツールを代わりに使用してくださいjq
。grep
これを行うにはいくつかの理由があります。
- 抽出した値は次のようになります。コード化。 ()オプションと組み合わせて使用すると、ツール
jq
はそれをデコードします。-r
--raw-output
- 使用時に値とキーを区別しない
grep
ため、抽出する意図のないデータが誤って抽出される可能性があります。
CTE_LG_LL_OE
最上位項目からキー値を抽出しますen
。
jq -r '.en.CTE_LG_LL_OE' file
値を文字列に設定ready
し、結果の文書をファイルに書き込みますnew-file
。
jq '.en.CTE_LG_LL_OE |= "ready"' file >new-file
この|=
演算子は、左側のキーの「パス」と右側のキーの新しい値を使用する「更新演算子」です。
シェル変数の値を設定するには:
jq --arg newval "$newvalue" '.en.CTE_LG_LL_OE |= $newval' file >new-file
これはjq
シェル変数から呼び出された変数を生成し、それを式に使用します。変数の値は自動的に.jsonにエンコードされます。$newval
newvalue
jq
jq
読みやすくするために少し間隔を置いてください(質問にタグが付けられているため、これがシェルスクリプトの一部であると仮定)。シェルスクリプト):
jq --arg newval "$newvalue" \
'.en.CTE_LG_LL_OE |= $newval' file >new-file
ファイルの内部編集(jq
内部編集はデフォルトではサポートされていません):
tmpfile=$(mktemp)
cp file "$tmpfile" &&
jq --arg newval "$newvalue" \
'.en.CTE_LG_LL_OE |= $newval' "$tmpfile" >file &&
rm -f "$tmpfile"
セリフチェロ:
tmpfile=$(mktemp); cp file "$tmpfile" && jq --arg newval "$newvalue" '.en.CTE_LG_LL_OE |= $newval' "$tmpfile" >file && rm -f "$tmpfile"
わからない場合どこドキュメント構造では、CTE_LG_LL_OE
キーはにあり、値を更新しようとします。みんな CTE_LG_LL_OE
値を含むキーwarn
:
jq '
(
.. |
select(type == "object" and .CTE_LG_LL_OE? == "warn").CTE_LG_LL_OE
) |= "ready"' file
これにより、文書全体のすべてのキーと値が再帰的に検証されます。CTE_LG_LL_OE
evalueを持つキーを持つすべてのオブジェクトを見つけてwarn
更新しますready
。改行は単に可読性のためのものです。
以前と同様に、シェル変数から値を取得できます。
jq --arg newval "$somevariable" '
(
.. |
select(type == "object" and .CTE_LG_LL_OE? == "warn").CTE_LG_LL_OE
) |= $newval' file
明らかに、この回答の前半に示すように、これは内部編集と組み合わせることもできます。
答え2
file.jsonのサンプルコンテンツでは、次の1行のコードが機能します。
cat file.json | jq '.en.CTE_LG_LL_OE = "ready"' | tee file.json
それを破壊する:
cat …
file.jsonの内容を標準出力(stdout)にコピーします。|
この出力を次のコマンドの標準入力(stdin)に送信します。jq '.en.CTE_LG_LL_OE = "ready"'
jqが「フィルタ」と呼ばれる機能('.en.CTE_LG_LL_OE = "ready"'
特定のキーに特定の値を割り当てる)がありますが、いいえ入力ファイルを指定します。これにより、jq
対応する入力が標準入力から読み出されます。| tee
標準出力に書き込むコマンドjq
で出力を送信するtee
そして指定されたファイル。
私は私の行動に混乱を感じた後にこの問題を見つけましたjq
。何らかの理由で(回答の比較https://stackoverflow.com/questions/48964305/write-output-to-a-file-after-piped-to-jq) 出力リダイレクトいいえ機能すると、jq
ファイル自体も読み込まれません。簡単に言えば、次のいずれもfile.jsonを切り取り、完全に空にしません。
jq '.en.CTE_LG_LL_OE = "ready"' file.json >file.json
jq '.en.CTE_LG_LL_OE = "ready"' file.json | tee file.json
cat file.json | jq '.en.CTE_LG_LL_OE = "ready"' >file.json
特定の標準コマンドラインオプションでこの動作が変更されることがあります。