1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

jqで特定の要素のみを変更してフィルタリングせずにもともとの形式のまま出力する

Posted at

やりたいこと

  • user01の.modeをtrueに変えたい

使うメソッド

  • map()
    • ListをMapへ変換
  • select()
    • 特定の要素のみを指定
  • !=
    • 要素を置換する
  • //
    • a // b で a ? a : b と評価される演算子
  • .

サンプル

[
  {
    "name": "user01",
    "majour_version": 1,
    "mode": false
  },
  {
    "name": "user02",
    "majour_version": 2,
    "mode": false
  },
  {
    "name": "user03",
    "majour_version": 2,
    "mode": false
  }
]

第一形態

とくに変わらないけれど、登場人物を全部当てはめる

cat test.json | jq '. |= map((select(0)) // .)'
[
  {
    "name": "user01",
    "majour_version": 1,
    "mode": true
  },
  {
    "name": "user02",
    "majour_version": 2,
    "mode": false
  },
  {
    "name": "user03",
    "majour_version": 2,
    "mode": false
  }
]

第二形態

登場する.modeをすべてtrueに変える

cat test.json | jq '. |= map((select(1).mode |= true) // .)'
[
  {
    "name": "user01",
    "majour_version": 1,
    "mode": true
  },
  {
    "name": "user02",
    "majour_version": 2,
    "mode": true
  },
  {
    "name": "user03",
    "majour_version": 2,
    "mode": true
  }
]

最終形態

狙ったuser01のmodeのみをtrueにすることができた

cat test.json | jq '. |= map((select(.name == "user01").mode |= true) // .)'
[
  {
    "name": "user01",
    "majour_version": 1,
    "mode": true
  },
  {
    "name": "user02",
    "majour_version": 2,
    "mode": false
  },
  {
    "name": "user03",
    "majour_version": 2,
    "mode": false
  }
]

ちなみに、最初ifで頑張っていたんだけれど、フィルタリングされてしまうので期待した出力にはならなかった

こんな感じ

if .name == "user01" then .mode=true else empty end

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?