代码之家  ›  专栏  ›  技术社区  ›  mfaiz

使用jq“contains”并在未找到键时抑制错误

  •  1
  • mfaiz  · 技术社区  · 6 年前

    我试图根据同一对象中另一个键的“contains”值获取值

    我已经尝试过一个代码,它可以工作并输出我想要的结果,但是JSON中的一些对象没有这个键,如我所得到的:

    jq: error (at <stdin>:1): null (null) and string ("BBC") cannot have their containment checked

    或者这个错误的原因是其他键中的数组,我不确定

    使用:

    jq '.entries[] | select(.icon | contains("BBC")) | .uuid'

    我希望找到的结果的UUID没有错误,并将其作为变量存储在shell中

    "174501xxxxxxxxxxxxxe6342a03"

    导入的输入文件

    {  
       "entries":[  
          {  
             "uuid":"174501xxxxxxxxxxxxxe6342a03",
             "enabled":true,
             "autoname":true,
             "name":"BBC",
             "number":0,
             "icon":"file:///logos/BBC.png",
             "icon_public_url":"imagecache/1097",
             "epgauto":true,
             "epggrab":[  ],
             "dvr_pre_time":0,
             "dvr_pst_time":0,
             "epg_running":-1,
             "services":[  ],
             "tags":[  ],
             "bouquet":""
          },
          {  
             "uuid":"174501xxxxxxxxxxxxxe6342a04",
             "enabled":true,
             "autoname":true,
             "name":"ABC",
             "number":0,
             "icon_public_url":"imagecache/1098",
             "epgauto":true,
             "epggrab":[  ],
             "dvr_pre_time":0,
             "dvr_pst_time":0,
             "epg_running":-1,
             "services":[  ],
             "tags":[  ],
             "bouquet":""
          }...
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   AKstat    6 年前

    有多种方法可以通过JQ实现这一点。您可以使用条件和分支,但我认为最简单的方法是使用 try-catch 没有 catch 只是为了消除任何错误。文件在 Conditionals and Comparisons

    这里是 an example 这将简单地忽略错误,并且仅在该对象没有错误时打印UUID:

    .entries[] | select(.icon | try contains("BBC")) | .uuid

        2
  •  2
  •   mickp    6 年前

    只能预选具有 icon 带钥匙 has("icon") .

    jq 1.5 Manual :

    has(key)

    内置函数 has 返回输入对象 具有给定的键,或者输入数组在给定的 索引。

    jq '.entries[] | select(has("icon")) | select(.icon | contains("BBC")).uuid' file
    

    但是,如果对象 "icon":null 在这种情况下,您可以使用:

    jq '.entries[] | select(.icon != null) | select(.icon | contains("BBC")).uuid' file