使用 sed 将唯一文本替换为 URL

Using sed to replace unique text with URL

我想找出一种更优雅的方法来用 URL.

替换文件中的一段独特文本

似乎 sed 将 URL 解释为其评估逻辑的一部分,而不是仅仅替换 bash 变量中的文本。

我的文件看起来像:

$srcRemoveSoftwareURL = "softwareURL"

我正在尝试(区分大小写)search/replace softwareURL 与实际的 URL.

我正在使用 bash 脚本来帮助进行操作,我正在设置我的变量,如下所示:

STORAGE_ENDPOINT_URL="http://mywebsite.com"

sas_url="se=2021-07-20T18%3A42Z&sp=rl&spr=https&sv=2018-11-09&sr=s&sig=oI/T9oHqzfEtuTjAotLyLN3IXbkiADGTPQllkyJlvEA%3D"

softwareURL="$STORAGE_ENDPOINT_URL/1-remove-software.sh?$sas_url"

# the resulting URL is like this:
# http://mywebsite.com/1-remove-software.sh?se=2021-07-20T18%3A42Z&sp=rl&spr=https&sv=2018-11-09&sr=s&sig=oI/T9oHqzfEtuTjAotLyLN3IXbkiADGTPQllkyJlvEA%3D

然后我用sed来替换文本:

sed "s|softwareURL|$softwareURL|" template_file.sh

我认识到 bash 正在优先选择 $softwareURL 变量并将其插入,但随后 sed 将 URL 解释为某些评估逻辑的一部分。

目前我生成的模板文件如下所示:

$srcRemoveSoftwareURL = "http://mywebsite.com/1-remove-software.sh?se=2021-07-20T18%3A42ZsoftwareURLsp=rlsoftwareURLspr=httpssoftwareURLsv=2018-11-09softwareURLsr=ssoftwareURLsig=oI/T9oHqzfEtuTjAotLyLN3IXbkiIIGTPQllkyJlvEA%3D

似乎 sed 也在 URL 中找到任何和号 & 字符并将其替换为文字 softwareURL.

我现在正在做的是再次将结果通过管道传输到 sed 并将 softwareURL 替换为 & 这似乎有点低效。

有更好的方法吗?

欢迎任何指导!

谢谢!

当前结果的问题是,在 sed 中,& 指的是在 sed/s 命令的第一部分中匹配的模式(在本例中 & == softwareURL).

一个想法是转义替换字符串中的所有 &'s,例如:

sed "s|softwareURL|$softwareURL|"          template_file.sh      # old
sed "s|softwareURL|${softwareURL//&/\&}|" template_file.sh      # new

使用此新命令生成:

$srcRemoveSoftwareURL = "http://mywebsite.com/1-remove-software.sh?se=2021-07-20T18%3A42Z&sp=rl&spr=https&sv=2018-11-09&sr=s&sig=oI/T9oHqzfEtuTjAotLyLN3IXbkiADGTPQllkyJlvEA%3D"

如果您发现自己需要多次更换:

$ somevariable="abc & % $ 123 & % $ xyz"
$ somevariable="${somevariable//&/\&}"     # escape literal '&'
$ somevariable="${somevariable//%/\%}"     # escape literal '%'
$ somevariable="${somevariable//$/\$}"     # escape literal '$'
$ echo $somevariable
abc \& \% $ 123 \& \% $ xyz

注意: 我并不是说您需要为 sed 转义这些特定字符 ... 只是指出如何在一个文件中进行多个替换变量。