使用 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,我们可以写
yq -i eval '.Key1 = "'"$var"'"' file
这是使用 yq 的“go”实现
$ yq --version
yq (https://github.com/mikefarah/yq/) version 4.25.1
我有一个 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 的
- 如果
pattern
以/
开头,则它是 全局 搜索和替换 - 模式是
\/
,它是一个正斜杠:需要对其进行转义,以免将其解释为模式和字符串之间的分隔符。 - 然后是
/
实际上将模式和替换字符串分开 - 替换字符串是
\\/
:\
是一个文字反斜杠(需要进入 sed 命令),最后\/
是一个文字斜杠。
${parameter/pattern/string}
“搜索和替换”形式
有了YAML处理工具yq,我们可以写
yq -i eval '.Key1 = "'"$var"'"' file
这是使用 yq 的“go”实现
$ yq --version yq (https://github.com/mikefarah/yq/) version 4.25.1