我非常努力地让 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 , 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 , line 1:
有谁知道如何使 Windows shell 对 jq 感到满意,以使上述示例按预期工作?
使用来自 jq 网站的最新 1.6 版本进行这些测试,并确认 jq 命令可以在 Linux 和 jqplay.org 上运行。
谢谢。
最佳答案
您有三个主要选择:
(简单)将 JSON 和 jq 程序放入单独的文件中(或者小心地放在一个文件中),然后相应地调用 jq。
(容易出错)遵循您正在使用的 shell 的引用规则。
上述的一些组合。
我理解的基本规则如下:在 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 除外。
好机会!
关于windows - 简单的 jq 过滤器在 Windows shell 中不起作用,各种引用问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54683103/