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

Posted

技术标签:

【中文标题】使用 sed 将唯一文本替换为 URL【英文标题】:Using sed to replace unique text with URL 【发布时间】:2021-09-17 09:54:52 【问题描述】:

我正在尝试找出一种更优雅的方法来用 URL 替换文件中的一段独特文本。

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

我的文件看起来像:

$srcRemoveSoftwareURL = "softwareURL"

我正在尝试(区分大小写)用实际 URL 搜索/替换 softwareURL

我正在使用 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 替换为&,这似乎有点低效。

有没有更好的方法来做到这一点?

欢迎任何指导!

谢谢!

【问题讨论】:

【参考方案1】:

当前结果的问题在于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 转义这些特定字符......只是指出如何在一个变量中进行多个替换。

【讨论】:

感谢您的详细解释!我非常感谢额外的帮助。这对我来说效果很好!

以上是关于使用 sed 将唯一文本替换为 URL的主要内容,如果未能解决你的问题,请参考以下文章

sed:无法使用变量替换最新出现的文本,包括“-”破折号

如何根据来自不同命令的多行打印输出的输入将文本文件内容替换为“sed”或“awk”?

unix sed怎么给每行前添加字符“/” 如果添加HEAD的话正常,但是要添加的文本是URL的话

linux下sed命令对文件执行文本替换

文本处理-sed

sed:替换文本块