如何使用 sed 将双引号中的字符串替换为变量?

如何使用 sed 将双引号中的字符串替换为变量?

我有一个包含这一行的文件:

  master_green_cloud_init_version = "v1.16/"

我的 bash 脚本将有一个类似 的参数userdata_version=v2.21

我怎样才能用sed来替换""(ie "v1.16/")之间的任何内容$userdata_version

我无法硬编码v1.16,因为它不断变化。

答案1

要使用sed, 对于您描述的场景,具有如下输入文件:

master_green_cloud_init_version = "v1.16/"
master_blue_cloud_init_version = "v1.16/"

这个脚本*

#!/bin/sh
  
userdata_version=v2.21
sed -i -e "/master_green_cloud_init_version/s/\".*\"/\"${userdata_version}\"/" input.txt

结果是

$ more input.txt
master_green_cloud_init_version = "v2.21"
master_blue_cloud_init_version = "v1.16/"
$

请注意,表达式需要双引号sed,为了使用 shell 变量,请参阅此回答sed 脚本中的 shell 变量

然后,您还需要使用 转义您正在搜索的双引号\"。您需要执行此操作两次,一次用于起始双引号,一次用于结束双引号。

它对-i输入文件起作用,而不仅仅是将结果输出到stdout.


笔记:如果出于某种原因,您希望将正斜杠保留在版本字符串的末尾,则可以使用转义的正斜杠 ( \/),如下所示:

#!/bin/sh

userdata_version=v2.21
sed  -e "/master_green_cloud_init_version/s/\".*\/\"/\"${userdata_version}\/\"/" input.txt

对于相同的输入文件,给出

master_green_cloud_init_version = "v2.21/"
master_blue_cloud_init_version = "v1.16/"

*如何在 Linux / Unix shell 中使用 sed 查找和替换文件中的文本:

如何使用 sed 匹配单词并执行查找和替换

在此示例中,仅查找单词“love”,如果行内容是特定字符串(例如 FOO),则将其替换为“sick”:

sed -i -e '/FOO/s/love/sick/' input.txt 

也可以看看如何替换文件中的字符串?

答案2

假设该文件是写入的配置文件TOML格式,那么你可以使用解析器tomlq更改值,给 shell 变量赋予userdata_version新值:

tomlq -t --arg newversion "$userdata_version" \
        '.master_green_cloud_init_version |= $newversion' file.toml

这会将顶级键的值更新为分配给内部变量的master_green_cloud_init_version值。修改后的文档将写入标准输出(您可以使用该选项进行就地编辑)。--arg$newversion--in-place

测试:

$ cat file.toml
  master_green_cloud_init_version = "v1.16/"
$ userdata_version=v2.21
$ tomlq -t --arg newversion "$userdata_version" '.master_green_cloud_init_version |= $newversion' file.toml
master_green_cloud_init_version = "v2.21"

相关内容