繁体   English   中英

使用 sed 使用包含特殊字符的字符串更新 yaml

[英]Updating a yaml with a string containing special characters using sed

我有一个 yaml 文件,需要使用包含特殊字符的字符串进行更新。 这是我使用的命令,但出现 sed 表达式错误

Yaml 文件(文件):

Key1: 
Key2: 

对于 $var(环境变量)没有特殊字符的命令:

sed  -i '0,/^\([[:space:]]*Key1: *\).*/s//\1'$var'/;' file

$var 的值:

fkugoiuhoiuyflkbbui/qy++bfv7J3c

我得到的错误是:

sed: -e expression #1, char 154: unknown option to `s'

我试图弄清楚如何才能使它正常工作。 任何帮助是极大的赞赏。 谢谢!

sed的默认分隔符与变量中的/冲突。 您将需要设置不同的分隔符,此外,单引号将不允许变量扩展。

你可以试试这个sed

$ sed "\|Key1|s|$|'$var'|" input_file
Key1: 'fkugoiuhoiuyflkbbui/qy++bfv7J3c'
Key2:

无论您选择什么s///分隔符,这个问题都可能发生。 正确的解决方案是处理数据中出现的任何分隔符

escaped=${var//\//\\\/}    # escape all slashes
sed  -i '0,/^\([[:space:]]*Key1: *\).*/s//\1'"${escaped}"'/;' file

打破它:

  • 这使用了${parameter/pattern/string} “搜索和替换”形式的Shell 参数扩展
  • 如果pattern/开头,则它是全局搜索和替换
  • 模式是\/ ,它是一个正斜杠:它需要被转义,以便它不会被解释为模式和字符串之间的分隔符。
  • 然后是/实际上将模式和替换字符串分开
  • 替换字符串是\\\/\\是文字反斜杠(需要进入 sed 命令),最后\/是文字斜杠。

使用 YAML 处理工具 ,我们可以编写

yq -i eval '.Key1 = "'"$var"'"' file

这是使用 yq 的“go”实现

$ yq --version yq (https://github.com/mikefarah/yq/) version 4.25.1

暂无
暂无

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

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