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

Remove slash character in JSON response using jq

Docker 引擎 API returns 容器名称带有 / 附加

{
    "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 中的 table:

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","Image"] | (., map(length*"-"))), ([ (.Names[] | gsub("^/";"")), .Image]) | @tsv'