我有一个包含这一行的文件:
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"