繁体   English   中英

如何在 YAML 文件中使用 sed

[英]How do I use sed in YAML file

我想在文件${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"

首先,您并没有真正在 YAML 文件中使用sed ,因为 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 中编写这样的命令行要容易得多,那就是使用文字样式 scalars 在这些标量中,由|引入没有反斜杠转义是可能的(在 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。 由于后者的文字标量比前者更具可读性,如果这对您有用,我当然会尝试。

(请注意,在两种文字样式标量中,末尾的双引号都已删除)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM