web-dev-qa-db-ja.com

jqを使用して複数のフィールド値を見つけて置き換える方法は?

次のjsonファイルでは、

{
  "email": "xxx",
  "pass": "yyy",
  "contact": [
    {
      "id": 111,
      "name": "AAA"
    }
  ],
  "lname": "YYY",
  "name": "AAA",
   "group": [
    {
      "name": "AAA",
      "lname": "YYY",
    }
  ],

キー「名前」を探して、すべての場所でその値を「XXX」に置き換える必要があります。それはどのjqコマンドですか?

9
user2181698

jq関数に基づくwalkの使用(最新バージョンが必要):

jq 'walk(.name?="XXX")' file

jqwalk関数をサポートしていない場合は、次のように定義します。

jq '
  # Apply f to composite entities recursively, and to atoms
  def walk(f):
    . as $in
    | if type == "object" then
       reduce keys[] as $key
         ( {}; . + { ($key):  ($in[$key] | walk(f)) } ) | f
    Elif type == "array" then map( walk(f) ) | f
    else f
    end;
  walk(.name?="XXX")
' file

クレジット: https://github.com/stedolan/jq/issues/96

9
oliv

または、jtcベースのソリューション:

bash $ jtc -w'<name>l+0' -u'"XXX"' your.json 
{
   "contact": [
      {
         "id": 111,
         "name": "XXX"
      }
   ],
   "email": "xxx",
   "group": [
      {
         "lname": "YYY",
         "name": "XXX"
      }
   ],
   "lname": "YYY",
   "name": "XXX",
   "pass": "yyy"
}
bash $ 
1
Dmitry L.