[英]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.