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

标签 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 , 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 上运行。

谢谢。

最佳答案

您有三个主要选择:

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

  2. (容易出错)遵循您正在使用的 shell 的引用规则。

  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"}]}

动力外壳

同样,除了散列和大括号,简单的解决方案是可能的:

使用单引号字符串:

 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/

相关文章:

c++ - 如何获取MFC对话框的对话框名称或对话框类?

windows - ESP 的值未正确保存....和 ​​C/C++ 调用约定

windows - Windows 服务项目中的 AppData\Roaming 文件夹

variables - Powershell 将变量传递给开始作业

windows - 目录名称中带有空格的循环批处理文件

C++ Windows dll查看器

function - 无法在函数的Where-Object 中使用变量

ant - 如何使用命令行参数压缩文件夹的内容?

windows - 为什么我们不能使用 CALL :label command in the FORFILES script?

powershell - 禁用启动程序