JQ двойной обратный слеш иногда удаляется - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть первый файл json, подобный этому:

{
  "env_vars": {
    "TERRAFORM_CFG_TLS_CERT": "-----BEGIN CERTIFICATE----\\nMIIIqzCCB5O"
  }
}

Если я использую команду:

echo <file> | jq -r '.env_vars'

Результат будет таким, как ожидалось (обратная косая черта все еще там):

{
  "TERRAFORM_CFG_TLS_CERT": "-----BEGIN CERTIFICATE----\\nMIIIqzCCB5O"
}

Но если я выполню эту команду:

cat <file> | jq -r '.env_vars' | jq -r 'keys[] as $k | "\($k)=\"\(.[$k])\""'

Результат:

TERRAFORM_CFG_TLS_CERT: "-----BEGIN CERTIFICATE----\nMIIIqzCCB5O"

=> Одна обратная косая черта была удалена ... почему?Как этого избежать?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Вы должны вывести строку как json, чтобы сохранить экранирование.Взяв строку и выведя ее необработанным, вы получите именно то, что было этой строкой, буквальный обратный слеш, за которым следует n.

$ ... | jq -r '.env_vars | to_entries[] | "\(.key): \(.value | tojson)"'

Если любое из значений не является строкой, добавьтеtostring к фильтру.

0 голосов
/ 22 ноября 2018

Использование параметра -r указывает jq «преобразовать» строку JSON в «необработанную» строку путем интерпретации символов, специфичных для JSON (см., Например, http://json.org). Таким образом, после [mcve] руководящие принципы чуть более подробно, мы могли бы начать с:

$ jq . <<< '"X\\nY"'
"X\\nY"

$ jq -r . <<< '"X\\nY"'
X\nY

Если вы проверите спецификацию строк json.org, вы увидите, что это точно.

Поэтому, если по какой-то причине вы хотите, чтобы каждое вхождение \\ в строке JSON было заменено двумя символами обратной косой черты (т. Е. JSON: "\\\\"), вы можете использовать sub или gsub. Это немного сложно, потому чтопервый аргумент этих функций - регулярное выражение. Вот:

$ jq -r 'gsub("\\\\"; "\\\\")' <<< '"X\\nY"'
X\\nY
...