首页 > 解决方案 > 如何将分号分隔的参数转换为json?

问题描述

我在 bash 中有这些变量。

DOC='ABC=123;CDE=345;CDE=IOP'
NEWVAR='101808'
NEWVAR2='10240404'

我想将它们组合起来并在 bash 中创建一个 json 字符串。

{
   "ABC": "123",
   "CDE": "345",
   "CDE": "IOP",
   "NEWVAR": "101808",
   "NEWVAR2": "10240404"
}

只有 'DOC' 是用分号分隔的值。NEWVAR 和 NEWVAR2 只是纯文本。

我可以使用 jq 来做到这一点吗?

标签: jsonbashcsvjq

解决方案


DOC='ABC=123;CDE=345;CDE=IOP'
NEWVAR='101808'
NEWVAR2='10240404'
args=()

# parse $DOC and add jq --arg options to the array
while IFS='=' read -r -d ';' name value || [[ -n $name && -n $value ]]; do
    args+=( --arg "$name" "$value" )
done < <(printf '%s' "$DOC")

# add the plain variables to the array
for var in NEWVAR NEWVAR2; do
    args+=( --arg "$var" "${!var}" )
done

declare -p args

jq --null-input  "${args[@]}" '$ARGS.named'

输出

declare -a args=([0]="--arg" [1]="ABC" [2]="123" [3]="--arg" [4]="CDE" [5]="345" [6]="--arg" [7]="CDE" [8]="IOP" [9]="--arg" [10]="NEWVAR" [11]="101808" [12]="--arg" [13]="NEWVAR2" [14]="10240404")
{
  "ABC": "123",
  "CDE": "345",
  "NEWVAR": "101808",
  "NEWVAR2": "10240404"
}

jq 显然忽略了重复的 --arg 变量。


推荐阅读