sed неопределенная команда `s 'со строкой jq json - PullRequest
1 голос
/ 17 января 2020

Откат от этого вопроса У меня есть команда (работает в Docker контейнере), где я пытаюсь sed заменить выражение на JSON строку, сгенерированную jq.

Крошечная предыстория:

У меня есть белый список переменных env в файле tmp.txt:

ENV_VAR_A
ENV_VAR_B
ENV_VAR_C

Я использую jq, используя ответ в предыдущем потоке, чтобы сгенерировать JSON Строка, как это:

jq -Rn '[inputs | {(.): env[.]}] | add' ./tmp.txt
# GENERATES { "ENV_VAR_A": "a val", "ENV_VAR_B": "a val", "ENV_VAR_C": "a val"}

Удивительно! Теперь я пытаюсь использовать sed (как Docker CMD) для замены чего-либо:

# CMD sed -i 's@{{SOME_PATTERN}}@'$( jq -Rn '[inputs | {(.): env[.]}] | add' ./etc/nginx/conf.d/env)'@' ./somefile

Но я получаю:

sed: -e expression #1, char 22: unterminated `s' command

Так что что-то пошло не так подстановка - но я не достаточно разбираюсь в оболочке, чтобы понять, как это исправить, я чувствую, что должен переместить некоторые кавычки / разделители или, возможно, направить свой jq к чему-то, чтобы «очистить» строку json перед Я заменяю, но я не уверен, что.

Ищете немного сед-фу, кто-нибудь может помочь?

Ответы [ 2 ]

1 голос
/ 17 января 2020

Это немного сложно, так как строка замены имеет много строк. Вы можете попробовать это sed с подстановкой процесса:

sed -i -e '/{{SOME_PATTERN}}/r '<( jq -Rn '[inputs | {(.): env[.]}] | add' /etc/nginx/conf.d/env) -e '//d' somefile

Убедитесь, что вы используете bash.

С немного измененной командой jq, которая производит однострочный вывод , вы можете просто сделать:

sed -i 's/{{SOME_PATTERN}}/'"$(jq -nRc '[inputs | {(.): env[.]}] | add' /etc/nginx/conf.d/env)"'/' somefile
0 голосов
/ 18 января 2020

@ Адам спросил:

как бы это выглядело?

Если ваш jq имеет опцию --rawfile, вам не нужно жонглировать jq и sed:

< somefile jq -R --rawfile text tmp.txt '
  ($text
   | split("\n")
   | map(select(length>0)
   | {(.): env[.]}) | add) as $json
  | sub("{{SOME_PATTERN}}"; $json|tostring)'


...