jqを使っていて「特定の文字列を含んでない」レコードをselectしたいみたいなケースの話
感覚的には条件式に!
をつけて否定したものを条件として使いたかったがそういう書き方はできない
調べてみたら次のスレッドで言及されていた
jq - How to filter a json that does not contain - Stack Overflow
true/false
に対してパイプでnot
に渡してあげればよいらしい
サンプルを用意していくつか試してみる
- sample.json
[ { "name": "hoge 1.1.1", "flag": true }, { "name": "fuga 2.1.1", "flag": false }, { "name": "3.3.3", "flag": true } ]
flagだけ取り出してみる
$ cat sample.json | jq '.[]|.flag' true false true
真偽値をnot
を使って反転させる
$ cat sample.json | jq '.[]|.flag|not' false true false
flag: false
のデータだけ抜き出してみる
$ cat sample.json | jq '.[]|select(.flag|not)' { "name": "fuga 2.1.1", "flag": false }
こういう感じで使えるのねということがわかったのであとは真偽値を返す関数を前段でかませてあげればやりようはいくらでもありそう
contains
を使ってname
にhoge
という文字列が含まれ「ない」か
cat sample.json | jq '.[]|contains({name: "hoge"})|not' false true true
name
にhoge
が含まれ「ない」データを抜き出す
$ cat sample.json | jq '.[]|select(contains({name: "hoge"})|not)' { "name": "fuga 2.1.1", "flag": false } { "name": "3.3.3", "flag": true }
manualが検索しづらかったので覚えておきます