简单的jq过滤器在Windows Shell中不起作用,各种引用问题

时间:2019-02-14 04:10:59

标签: windows powershell cmd jq

我正在竭尽全力使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上使用。

谢谢。

1 个答案:

答案 0 :(得分:2)

您有三个主要选择:

  1. (轻松)将JSON和jq程序放入单独的文件中(或小心翼翼地放入一个文件中),然后相应地调用jq。

  2. (容易出错),请遵循所用外壳的报价规则。

  3. 上述各项的组合。

据我了解,基本规则如下:在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"}]}

Powershell

同样,除了哈希和花括号外,还可以使用简单的解决方案:

使用单引号字符串:

 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。

结盟的机会!