Literały ciągów w JQ przy użyciu programu PowerShell [duplikat]

Nov 30 2020

Nie mogę uruchomić literałów ciągów JQ z programu PowerShell. Na przykład wyprowadza ładny obiekt JSON w Bash, ale kończy się niepowodzeniem w programie Powershell:

PS C:\temp> jq --null-input '{"key":"val"}'

jq: error: val/0 is not defined at <top-level>, line 1:
{key:val}
jq: 1 compile error

Początkowo podejrzewałem nieprawidłowe cytowanie, ale Write-Output '{"key":"val"}'wyniki są {"key":"val"}zgodne z oczekiwaniami.

Mogę obejść ten problem, zapisując mój filtr JQ w pliku. Użycie .NET WriteAllTextgwarantuje, że plik zostanie zakodowany jako UTF-8 bez BOM.

PS C:\temp> [System.IO.File]::WriteAllText('basic.jq', '{"key":"val"}')
PS C:\temp> jq --null-input --from-file basic.jq
{
  "key": "val"
}

Szukam bardziej zwinnego podejścia do prototypowania filtrów JQ i integracji ich w skryptach PowerShell.

Wersje: JQ 1.6 dla win64, PSVersion 5.1.18362.1171

Odpowiedzi

1 Inian Nov 30 2020 at 21:20

Powershell może chcieć, abyś uniknął podwójnych cudzysłowów wewnątrz '..'wyrażenia. Próbować

jq --null-input '{ "key": \"val\" }'

lub tuż poniżej, ponieważ nazwy kluczy w jqnie wymagają wyraźnego cudzysłowu

jq --null-input '{ key: \"val\" }'

Z jqinstrukcji pod - Invoking jq

Podczas korzystania z powłoki poleceń systemu Windows ( cmd.exe) najlepiej jest używać podwójnych cudzysłowów wokół programu jq, gdy jest on podawany w wierszu poleceń (zamiast -f program-fileopcji), ale wtedy podwójne cudzysłowy w programie jq wymagają użycia znaku ucieczki odwrotnym ukośnikiem.