4

command:

cat test.json | jq -r '.[] | select(.["$link"] | contains("randomtext1")).id'

I was expecting to have both ids (a and b) show up as result of the above command since they both contains "randomtext1" text under

"input"|"obj1"|"$link" and "input"|"obj3"|"$link". 
jq: error (at <stdin>:11): null (null) and string ("randomtext1") cannot have their containment checked
parse error: Expected value before ',' at line 11, column 2

I see that the "$link" object is within the "input" and "obj#" objects. How do I specify them or do I need to? The error message seems to be pointing to something else. Also only the "input" and "$link" are constant among the records, the name of the "obj#" can change which makes them random.

The test.json file:

[{
      "input": {
            "obj1": {
                "$link": "randomtext1"
            }, 
            "obj2": {
                "$link": "randomtext2"
            }
      },
      "id": "a"
},
{
      "input": {
            "obj3": {
                "$link": "randomtext1"
            }, 
            "obj4": {
                "$link": "randomtext3"
            }
      },
      "id": "b"
}]
ggorlen
  • 44,755
  • 7
  • 76
  • 106
Mr Janitor
  • 81
  • 1
  • 8

1 Answers1

2

The filter:

.[]
| select(.input[] | .["$link"] | contains("randomtext1")) 
| .id

produces:

"a"
"b"

Note, however, that contains has very complex semantics, so it would probably be better to use index instead.

peak
  • 105,803
  • 17
  • 152
  • 177