Простые фильтры 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 ответ
У вас есть три основных варианта:
(Легко) Поместите программу JSON и jq в отдельные файлы (или, может быть, осторожно, в один файл) и соответственно вызовите jq.
(Подвержен ошибкам) Следуйте правилам цитирования используемой оболочки.
Некоторая комбинация вышеперечисленного.
Основное правило, как я понимаю, заключается в следующем: в 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.
Боннский шанс!