使用 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//'$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//'"${escaped}"'/;' file

分解:

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

有了YAML处理工具,我们可以写

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

这是使用 yq 的“go”实现

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