使用jq删除JSON响应中的斜杠字符

问题描述

Docker Engine API返回带有/附加的容器名称

{
    "Id": "8dfafdbc3a40","Names": [
        "/boring_feynman"
    ],"Image": "ubuntu:latest","ImageID": "d74508fb6632491cea586a1fd7d748dfc5274cd6fdfedee309ecdcbc2bf5cb82","Command": "echo 1","Created": 1367854155,"State": "Exited","Status": "Exit 0","Ports": [{
        "PrivatePort": 2222,"PublicPort": 3333,"Type": "tcp"
    }],"Labels": {
        "com.example.vendor": "Acme","com.example.license": "GPL","com.example.version": "1.0"
    },"SizeRw": 12288,"SizeRootFs": 0,"HostConfig": {
        "NetworkMode": "default"
    },"NetworkSettings": {
        "Networks": {}
    },"Mounts": [{
        "Name": "fac362...80535","Source": "/data","Destination": "/data","Driver": "local","Mode": "ro,Z","RW": false,"Propagation": ""
    }]
}

我想删除斜杠,以便将响应用作JQ中的表格:

jq -r '(["Names","Image"] | (.,map(length*"-"))),(.[] | [.Names,.Image]) | @tsv'

当前,当我运行上述代码时,我得到:

jq: error (at <stdin>:1): array (["/boring_feynman"]) is not valid in a csv row

解决方法

问题不是因为/字段中的.Names,而是因为您的表达式中。为了使@csv@tsv之类的过滤器正常工作,这些值必须采用标量格式和数组形式。但是您的表达式.Name的类型为array

因此,基本上,您是将结果传递给@tsv函数

[
  [
    "/boring_feynman"
  ],"ubuntu:latest"
]

代替

[
  "/boring_feynman","ubuntu:latest"
]

因此,修改过滤器,您可以在下面处理有问题的JSON。

jq -r '(["Names","Image"] | (.,map(length*"-"))),([.Names[],.Image]) | @tsv'

或者如果您仍然想删除/,请使用gsub()函数

jq -r '(["Names",([ (.Names[] | gsub("^/";"")),.Image]) | @tsv'