Jq 处理空字符串并将其替换为默认值

Mar*_*ing 2 bash json jq

我目前有一个用 jq 操作的 json 文件。在大多数情况下,我能够按照我想要的方式显示它。但是,在显示空字段的值时遇到问题。我正在使用//替代运算符,但它没有返回所需的输出。使用 jq 处理空字符串的正确方法是什么?

电流输出:

RELEASE    INSTALLED  LATEST  DEPRECATED
test-app   1.0.0      2.0.0   false
test-app2  3.0.0      true
Run Code Online (Sandbox Code Playgroud)

期望的输出:

RELEASE    INSTALLED  LATEST  DEPRECATED
test-app   1.0.0      2.0.0   false
test-app2  3.0.0      -        true
Run Code Online (Sandbox Code Playgroud)

杰q:

cat test1.json | jq -r 'map({release, installed: .Installed.version, latest: (.Latest.version // "-"), deprecated}) | ( .[0] | keys_unsorted | map(ascii_upcase)), (.[] | [.[]]) | @tsv' | column -t
Run Code Online (Sandbox Code Playgroud)

杰森:

[
  {
    "release": "test-app",
    "Installed": {
      "version": "1.0.0",
      "appVersion": ""
    },
    "Latest": {
      "version": "2.0.0",
      "appVersion": ""
    },
    "outdated": true,
    "deprecated": false
  },
  {
    "release": "test-app2",
    "Installed": {
      "version": "3.0.0",
      "appVersion": ""
    },
    "Latest": {
      "version": "",
      "appVersion": ""
    },
    "outdated": false,
    "deprecated": true
  }
]
Run Code Online (Sandbox Code Playgroud)

Jef*_*ado 6

如果空字符串""是您想要视为的唯一情况null,您可以使用替代运算符强制它,然后根据需要进行替换。

.Latest.version // "" | select(. != "") // "-"

# or using if-then-else
.Latest.version // "" | if . == "" then "-" else . end

# or if you're using the latest dev version, else is optional
.Latest.version // "" | if . == "" then "-" end
Run Code Online (Sandbox Code Playgroud)