Простые фильтры jq, не работающие в оболочке Windows, различные проблемы цитирования

Я очень стараюсь, чтобы оболочка Windows работала с 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 jq, чтобы приведенные выше примеры работали как положено?

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

благодарю вас.

1 ответ

Решение

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

  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.

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

Другие вопросы по тегам