所以我有一个从xml转换而来的json文件。我试图在bash脚本中使用jq来解决这个问题。
命令行jq -r '.users.user[0].id."#text"' cosmology18.json
的当前效果非常好并且显示输出完美
首先我参与了第一部分阅读用户数据
baselineresult=$(jq -r '.users.user[1].cpid."#text"' $1)
允许我回应完整的数据
然而,当我尝试添加$basecount
时,每次我无法使其工作,所以我构建了这种疯狂的方法,我不得不使用替换来将$ basecount放入[]用户。
bracea="["
braceb="]"
dquote='"'
squote="'"
pound="#"
echo test of command is jq -r "${squote}.users.user${bracea}${basecount}${braceb}.cpid.${dquote}#text${dquote}${squote} $1"
baselineresult=$(jq -r "${squote}.users.user${bracea}${basecount}${braceb}.cpid.${dquote}${pound}text${dquote}${squote} $1")
echo $baselineresult
该命令与我在命令行输入的命令相匹配。
然而我明白了:
命令测试是jq -r' .users.user [0] .cpid。" #text"' cosmology18.json jq:错误:语法错误,意外的INVALID_CHARACTER,期待$ end(Unix shell引用问题?)在第1行: ' .users.user [0] .cpid"#文本"' cosmology18.json jq:1编译错误
任何想法..现在已经8个小时了。 我似乎无法找到这个非法字符,因为输出与jq -r' .users.user [0] .id。" #text" #text"#text 34;' cosmology18.json
答案 0 :(得分:0)
问题在于,您不知道bash
语法和jq
语法是什么,因此您要将它们合并在一起。< / p>
以下是jq
期望的一个例子:
.users.user[1].cpid."#text"
以下是您提供的内容:
'.users.user[1].cpid."#text"' filename
jq
永远不会看到单引号,在您的工作命令中,他们使用bash语法来指定要传递给jq
的字符串。相反,你试图给jq
单引号,它不知道这意味着什么。
类似地,文件名后面的空格是bash语法,用于指定要传递第二个参数。相反,你试图在它的第一个参数中将它们提供给jq
,这是它不期望的。
要jq
,此命令与原始命令无法区分(导致execve
调用具有完全相同的参数)。您可以改变变量以获得不同的索引:
var=1
baselineresult=$(jq -r '.users.user['"$var"'].cpid."#text"' "$1")