Простые фильтры jq не работают в оболочке Windows, различные проблемы цитирования - PullRequest
0 голосов
/ 14 февраля 2019

Я очень стараюсь, чтобы оболочка Windows работала с jq и терпела неудачу.

Я хочу, чтобы этот тип вещей работал

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

Но я получаю ошибку:

jq: error: синтаксическая ошибка, неожиданное '.'(Проблемы с цитированием в командной оболочке Windows?) В строке 1:

Если я просто сделаю echo '["a","b","c"]' | .\Downloads\jq.exe -r '.', то это будет хорошо, но как только я добавлю другие символы, такие как echo '["a","b","c"]' | .\Downloads\jq.exe -r '{.}', произойдет сбой снова с:

jq: error: синтаксическая ошибка, неожиданный '.'(Проблемы цитирования оболочки Windows cmd?) В строке 1:

Кто-нибудь знает, как порадовать оболочку Windows jq, чтобы приведенные выше примеры работали как положено?

Использование последних1.6 для этих тестов собрал сайт jq и подтвердил, что команды jq работают с использованием Linux и jqplay.org.

Спасибо.

1 Ответ

0 голосов
/ 14 февраля 2019

У вас есть три основных варианта:

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

Postscript

За исключением хеша (#) и фигурных скобок (* 1029)*) в строке можно достичь цели, избегая пробелов:

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.

Боннский шанс!

...