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

Flo*_*Woo 3 windows powershell cmd jq

我真的很努力地让 Windows shell 与 jq 一起工作并且失败了。

我希望这种类型的东西起作用

echo '["a","b","c"]' | .\Downloads\jq.exe -r '{ "data": map({ "{#SNAME}": . })}'
Run Code Online (Sandbox Code Playgroud)

但我收到一个错误:

jq:错误:语法错误,意外的“。” (Windows cmd shell 引用问题?)在第 1 行:

如果我只是这样做,echo '["a","b","c"]' | .\Downloads\jq.exe -r '.'那么它很高兴,但是一旦我添加其他字符,echo '["a","b","c"]' | .\Downloads\jq.exe -r '{.}'它就会再次失败:

jq:错误:语法错误,意外的“。” (Windows cmd shell 引用问题?)在第 1 行:

有谁知道如何让 Windows shell 对 jq 感到满意,以使上述示例按预期工作?

使用来自 jq 网站的最新 1.6 版本进行这些测试,并确认 jq 命令使用 Linux 和 jqplay.org 工作。

谢谢你。

pea*_*eak 5

您有三个主要选择:

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

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

  3. 以上的一些组合。

我理解的基本规则如下:在 Windowscmd命令行提示符下,为了引用字符串,您使用双引号,并使用反斜杠转义字符串中的双引号。

例如:

C>ver
Microsoft Windows [Version 10.0.17134.590]

C>echo "hello \"world\"" | jq .
"hello \"world\""

C>jq -n "\"hello world\""
"hello world"
Run Code Online (Sandbox Code Playgroud)

你的榜样

C>echo ["a","b","c"] | jq -c "{\"data\":map({\"{#SNAME}\":.})}"
{"data":[{"{#SNAME}":"a"},{"{#SNAME}":"b"},{"{#SNAME}":"c"}]}
Run Code Online (Sandbox Code Playgroud)

后记

除了字符串中的哈希 ( #) 和大括号 ( {}) 之外,可以通过避免空格来实现目标:

C>echo ["a","b","c"] | jq -c {"data":map({"SNAME":.})}
{"data":[{"SNAME":"a"},{"SNAME":"b"},{"SNAME":"c"}]}
Run Code Online (Sandbox Code Playgroud)

电源外壳

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

使用单引号字符串:

 echo '["a", "b", "c"]' | jq -c '{"data": map( {"SNAME": . })}'
 {"data":[{"SNAME":"a"},{"SNAME":"b"},{"SNAME":"c"}]}
Run Code Online (Sandbox Code Playgroud)

使用""内部双引号字符串:

echo '["a", "b", "c"]' | jq -c "{""data"": map( {""SNAME"": . })}"
{"data":[{"SNAME":"a"},{"SNAME":"b"},{"SNAME":"c"}]}
Run Code Online (Sandbox Code Playgroud)

我见过的 PowerShell 文档表明反引号可用于转义双引号字符串中的特殊字符,但 YMMV。

博纳机会!

  • 谢谢,这是一个很大的帮助。我相信我感到沮丧的部分原因是我的测试是在基于 powershell 的 Windows 提示中完成的……而不仅仅是普通的旧 cmd shell。这是一个痛苦的世界。 (2认同)