Json 以逗号分隔的BASH形式输出数组

Json 以逗号分隔的BASH形式输出数组,json,bash,rest,Json,Bash,Rest,我试图从一个json格式的API中提取变量,然后将它们放回一起,并更改一个变量,然后将它们作为put返回 唯一的问题是,每个值中都有引号,必须返回到仅用逗号分隔的API 它应该在**内的编辑信息和变量中看到的示例: curl -skv -u redacted:redacted -H Content-Type: application/json -X PUT -d'{properties:{basic:{request_rules:[**"/(req) testrule","/test-body"

我试图从一个json格式的API中提取变量,然后将它们放回一起,并更改一个变量,然后将它们作为put返回

唯一的问题是,每个值中都有引号,必须返回到仅用逗号分隔的API

它应该在**内的编辑信息和变量中看到的示例:

curl -skv -u redacted:redacted -H Content-Type: application/json -X PUT -d'{properties:{basic:{request_rules:[**"/(req) testrule","/test-body","/(req) test - Admin","test-Caching"**]}}}' https://x.x.x.x:9070/api/tm/1.0/config/active/vservers/xxx-xx
很明显,如果我将它们作为普通数组激发,我会得到空格而不是逗号。然而,我尝试将其作为普通字符串输出

longstr=$(echo ${valuez[@]})
output=$(echo $longstr |sed -e 's/" /",/g')
由于bash的解释方式,它似乎要么解释错误的引用,要么解释其他东西。我想这很可能是在PUT-d之后封装的单个tick,但我不确定如何将变量放入具有单个tick的内容中

如果我手动输入原始数据,它就会工作,因此它要么是变量的发送方式,要么是单个刻度。我没有收到错误,当我回显线路时,它看起来很完美


有什么想法吗?

如果您有支持FPAT的gnu awk版本4及更高版本

output=$(echo $longstr |awk '$1=$1' FPAT="(\"[^\"]+\")" OFS=",")
解释 FPAT 这是一个字符串形式的正则表达式,告诉gawk基于与正则表达式匹配的文本创建字段。将值指定给FPAT会覆盖使用FS和FieldWidth进行字段拆分。有关详细信息,请参见按内容拆分。 如果gawk处于兼容模式,请参见选项,则FPAT没有特殊含义,字段拆分操作仅基于FS的值进行。 如果您需要重复执行某项操作,但需要将其转换为函数:

toCSV () { 
    local csv sep val
    for val; do
        csv+="$sep\"$val\""
        sep=,
    done
    echo "$csv"
}

csv=$(toCSV "${valuez[@]}")

请显示valuez[@]的相同示例值?/req testrule/test body/req test-Admin,test Caching因此输出应该是/req testrule,/test body,/req test-Admin,test Caching,但是valuez[@]中已经有一个,并且出现了问题?对不起,没有,我没有从上面复制它。在otput之间是空白的,但我必须编辑内容简言之,数组是另一回事。基本上,当我使用sed将数组输入变量时,它工作得很好。即使有一个逗号,它仍然可以工作,因为sed只替换引号{error\u id:json.parse\u error,error\u text:Invalid json data:Hash key was not quote}后面的空格。您认为它可能是单引号吗?就像我说的,当我把原始数据放进去时,它工作得很好。
"/(req) testrule","/test-body","/(req) test - Admin","test-Caching"
toCSV () { 
    local csv sep val
    for val; do
        csv+="$sep\"$val\""
        sep=,
    done
    echo "$csv"
}

csv=$(toCSV "${valuez[@]}")
valuez=( "/(req) testrule" "/test-body" "/(req) test - Admin" "test-Caching" )

# Temporarily set IFS to some character which is known not to appear in the array.

oifs=$IFS
IFS=$'\014'

# Flatten the array with the * expansion giving a string containing the array's elements separated by the first character of $IFS.

d_arg="${valuez[*]}"
IFS=$oifs

# If necessary, quote or escape embedded quotation marks.  (Implementation-specific, using doubled double quotes as an example.)
d_arg="${d_arg//\"/\"\"}"

# Substitute the known-to-be-absent character for the desired quote+separator+quote.

d_arg="${d_arg//$'\014'/\",\"}"

# Prepend and append quotes.

d_arg="\"$d_arg\""

# insert the prepared arg into the final string.

d_arg="{properties:{basic:{request_rules:[${d_arg}]}}}"

curl ... -d"$d_arg" ...