正确随机字符串

时间:2018-06-20 17:37:06

标签: regex sed replace parameters

我正在使用第三方服务(在本例中为AWS参数存储)存储密码(数据库凭证,aws凭证)和机密。我需要使用存储在其中的参数来构建/运行docker映像,因此在构建服务器中,我想运行类似以下内容:

sed -i 's/AWS_SECRET_KEY/'$aws_secret_key/ Dockerfile

其中AWS_SECRET_KEY是Dockerfile中的字符串,需要替换为$ aws_secret_key,这是一个包含实键的变量。 问题是秘密密钥和数据库密码足够随机,因此它们包含“ /”符号。我经历了this answer,它看起来像是要走的路,但是我也有一个需要存储的json字符串,它包含正斜杠,空格,双引号和单引号。 所以我的问题是,是否有任何方法可以更改包含随机符号/空格的字符串的文件(不必进行sed操作),这样它在替换时间就不会抛出错误?

1 个答案:

答案 0 :(得分:0)

(假设bash:无论您选择哪个分隔符,您都想使用Shell Parameter Expansion来跳过s///分隔符。

sed "s,AWS_SECRET_KEY,${aws_secret_key//,/\\,},g" Dockerfile

如果使用默认的s///,则只需要一些额外的转义符即可:

sed "s/AWS_SECRET_KEY/${aws_secret_key//\//\\\/}/g" Dockerfile

演示:

$ cat Dockerfile 
foo AWS_SECRET_KEY bar
$ aws_secret_key="he//o,world"
$ sed "s,AWS_SECRET_KEY,${aws_secret_key//,/\\,},g" Dockerfile
foo he//o,world bar
$ sed "s/AWS_SECRET_KEY/${aws_secret_key//\//\\\/}/g" Dockerfile
foo he//o,world bar

更新:

基于karakfa的评论,我缺少保护s///命令替换端中某些特殊字符的保护。为了获得最大的反斜杠,请在每个非字母数字字符前添加一个反斜杠:

$ aws_secret_key='he//o,world&\'
$ escaped=$(echo "$aws_secret_key" | sed 's/[^[:alnum:]]/\\&/g')
$ echo "$aws_secret_key"; echo "$escaped"
he//o,world&\
he\/\/o\,world\&\\
$ sed "s/AWS_SECRET_KEY/$escaped/g" Dockerfile
foo he//o,world&\ bar