Как использовать sed в файле YAML - PullRequest
0 голосов
/ 29 декабря 2018

Я хочу заменить ][ на , в файле ${NGINX_BASE_DIR}/learn-instances.json.
Но постоянно возникает ошибка.Я озадачен мягкой цитатой и sed.

error: error converting YAML to JSON: yaml: line 27: found unknown escape character

"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:

containers:
      - name: retrieve-data
        image: sun-java8-build:3
        args:
        - /bin/sh
        - -c
        - "while true; do sed -i 's#\]\[#,#g' ${NGINX_BASE_DIR}/learn-instances.json; sleep 900; done"

1 Ответ

0 голосов
/ 29 декабря 2018

Прежде всего, вы не используете 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.Поскольку последний литеральный скаляр гораздо более читабелен, чем первый, я непременно попробую, если он вам подходит.

(Обратите внимание, что в обоих скалярах литерального стиля двойные кавычки в конце были удалены)

...