我正在竭尽全力使Windows Shell与jq一起使用,并且失败了。
我希望这种事情能解决
echo '["a","b","c"]' | .\Downloads\jq.exe -r '{ "data": map({ "{#SNAME}": . })}'
但是它给出了错误:
jq: error: syntax error, unexpected '.' (Windows cmd shell quoting issues?) at <top-level>, line 1:
如果我只是做echo '["a","b","c"]' | .\Downloads\jq.exe -r '.'
那就很高兴,但是一旦我添加了其他字符(例如echo '["a","b","c"]' | .\Downloads\jq.exe -r '{.}'
),它就会再次失败,并显示:
jq: error: syntax error, unexpected '.' (Windows cmd shell quoting issues?) at <top-level>, line 1:
有人知道如何使Windows shell对jq满意,以使上述示例按预期工作吗?
使用jq网站上的最新1.6版本进行这些测试,并确认jq命令可在Linux和jqplay.org上使用。
谢谢。
答案 0 :(得分:2)
您有三个主要选择:
(轻松)将JSON和jq程序放入单独的文件中(或小心翼翼地放入一个文件中),然后相应地调用jq。
(容易出错),请遵循所用外壳的报价规则。
上述各项的组合。
据我了解,基本规则如下:在Windows cmd
命令行提示符下,为了对字符串加引号,请使用双引号,并使用反斜杠对字符串内的双引号进行转义。
例如:
C>ver
Microsoft Windows [Version 10.0.17134.590]
C>echo "hello \"world\"" | jq .
"hello \"world\""
C>jq -n "\"hello world\""
"hello world"
C>echo ["a","b","c"] | jq -c "{\"data\":map({\"{#SNAME}\":.})}"
{"data":[{"{#SNAME}":"a"},{"{#SNAME}":"b"},{"{#SNAME}":"c"}]}
除了字符串中的哈希(#
和花括号({}
)外,还可以通过避免空格来实现目标:
C>echo ["a","b","c"] | jq -c {"data":map({"SNAME":.})}
{"data":[{"SNAME":"a"},{"SNAME":"b"},{"SNAME":"c"}]}
同样,除了哈希和花括号外,还可以使用简单的解决方案:
使用单引号字符串:
echo '["a", "b", "c"]' | jq -c '{"data": map( {"SNAME": . })}'
{"data":[{"SNAME":"a"},{"SNAME":"b"},{"SNAME":"c"}]}
在双引号字符串中使用""
:
echo '["a", "b", "c"]' | jq -c "{""data"": map( {""SNAME"": . })}"
{"data":[{"SNAME":"a"},{"SNAME":"b"},{"SNAME":"c"}]}
我见过的PowerShell文档建议反引号可用于转义双引号字符串中的特殊字符,但YMMV。
结盟的机会!