Прежде всего, вы не используете sed
в файле YAML, так как YAML не знает о выполнении программ.Что происходит, если у вас есть какая-то программа (nginx
или какой-нибудь плагин для этого?), Которая загружает YAML и затем интерпретирует данные, а затем выполняет программу, указанную в этих данных.
Что вам нужноизвестно, что скаляры YAML, которые загружаются как строки, имеют различные опции для экранирования специальных символов.Вы используете простые скаляры (без кавычек) и двойные кавычки (есть еще три стиля).
В простых скалярах экранирование не выполняется, но это означает, что вы не можете использовать многие специальные символы вскаляр (например, нет [
, {
, &
или *
и т. д. в начале, а не :
+ пробел или пробел + #
в любом месте), поскольку они имеют значение в YAML.
Если у вас есть специальные символы, нужно использовать скаляры с двойными кавычками, но вы должны знать, что обратная косая черта (\
) имеет особое значение в YAML в таких скалярах.И в вашем \]
обратная косая черта не сопровождается одним из определенных экранированных символов YAML , и это выдает ошибку.
Если вы действительно хотите, чтобы программа, загружающая YAML, видела\[
, тогда в скаляре с двойными кавычками необходимо указать \\[
.Таким образом, вы могли бы написать свою последнюю строку как:
- "while true; do sed -i 's#\\]\\[#,#g' ${NGINX_BASE_DIR}/learn-instances.json; sleep 900; done"
Но только удвоение обратной косой черты - это не единственная вещь, о которой вам нужно позаботиться, например, если следующий символ необходимо экранировать в YAML, а также дляsed
.Таким образом, любой \"
в таком скаляре необходимо преобразовать в \\\"
.
. В YAML гораздо проще написать такие командные строки, и для этого используются скалярные литеральные стили ,Внутри этих скаляров, введенных |
, экранирование от обратной косой черты невозможно (на уровне YAML), и вы можете сохранить свою командную строку такой, как она есть:
- |-
while true; do sed -i 's#\]\[#,#g' ${NGINX_BASE_DIR}/learn-instances.json; sleep 900; done
И действительно, поскольку переводы строк сохраняются в скалярах литерального стиляВы можете сделать:
- |
while true
do
sed -i 's#\\]\\[#,#g' ${NGINX_BASE_DIR}/learn-instances.json
sleep 900
done
в зависимости от того, как программа загружает и обрабатывает YAML.Поскольку последний литеральный скаляр гораздо более читабелен, чем первый, я непременно попробую, если он вам подходит.
(Обратите внимание, что в обоих скалярах литерального стиля двойные кавычки в конце были удалены)