jq 输出中不要以空格分隔

jq 输出中不要以空格分隔

我使用 jq 将单词数组转换为 java 程序的参数。

就像是

arguments=$(jq '.nameField | "-i " + "\"" + . + "\""' file.json)

java .... $arguments  <-- No quotes wrapped around arguments.

预期产出:Java 必须读作-i "Name 1" -i "Name 2",并且“ Name 1”应读作一个完整的参数。

收到输出:Java 在分别读取"Name1""Name时抛出错误2"

我希望它将“Name 1”视为单个实体。

答案1

您需要将参数存储在数组中。

假设 .nameField 值从不包含换行符:

readarray -t arguments < <(jq -r '.nameField | "-i", .' file.json)

java ... "${arguments[@]}"

jq命令在单独的行上发出“-i”和每个名称;该readarray命令将行读入数组中。

我试图将命令放入变量中,但复杂的情况总是失败!


为了使您的代码正常工作,您需要eval java ... $arguments,通常不推荐这样做

答案2

尝试这个:

eval "arguments=($(jq -r '.nameField | ["-i", .] | @sh' file.json))"
java ... "${arguments[@]}"

答案3

假设输入 JSON 文件在其顶层包含多个对象,而不是在数组中,而是如下所示:

{"nameField":"Name 1"}
{"nameField":"Name 2"}
{"nameField":"Name 3"}
{"nameField":"Name 4"}
{"nameField":"Name 5"}

...并且没有nameField值包含任何嵌入的换行符(或 NUL),然后使用jq提取所有值并构造一个bash数组,arguments如下所示:

arguments=()
while IFS= read -r name; do
    arguments+=( -i "$name" )
done < <( jq -r '.nameField' file.json )

然后在扩展数组时调用 Java 代码:

java ... "${arguments[@]}"

请注意,扩展"${arguments[@]}"必须像此处所示的那样精确引用,否则 shell 会在每个值中包含的任何空格或制表符上拆分每个值(并对生成的字符串执行文件名通配)。

如果您想将 JSON 字符串传递给您的 Java 代码(问题中不清楚),请-rjq.这会将字符串传递给java命令,就像参数已被写入-i '"Name 1"' -i '"Name 2"'等一样,参数中包含文字双引号。这消除了值不能包含嵌入的换行符或 NUL 的限制nameField(因为它们将分别编码为\n\u0000)。

相关内容