我有一个变量映射,我需要在 bash 脚本中动态替换特定变量的值。我的变量是这样的:
array = {
node1 = [
{
"apacheversion" = "1.0"
"mysqlversion" = "2.0"
}
]
node2 = [
{
"apacheversion" = "1.0"
"mysqlversion" = "2.0"
}
]
}
所以,我需要用 'sed' 替换 apacheversion 和 mysqlversion 的值。
"apacheversion" = "new.value" "mysqlversion" = "new.value"
有没有办法只在特定节点上执行?例如仅替换node1。如果不可能,我不介意,因为它是变量的临时文件。
谢谢!
答案1
虽然通常最好使用解析器,但一种方法是通过awk
.通过正则表达式选择块/start/,/end/
,然后仅对该块进行操作:
awk '/node1 = \[/,/\]/ {
if ($0 ~ /apacheversion/) {gsub(/1.0/,"new.version")}
if ($0 ~ /mysqlversion/) {gsub(/2.0/,"new.version")}
} 1' file.terra
如果您将eg 定义=
为字段分隔符,那么您可能会更通用并替换字段2 的任何内容,而不是使用gsub
模式匹配+替换。
现在,要在脚本中使用它,请从环境中获取变量:
#!/bin/bash
varAPA=2.0
varSQL=5.0
awk -v newAPA="$varAPA" -v newSQL="$varSQL" '/node1 = \[/,/\]/ {
if ($0 ~ /apacheversion/) {gsub(/1.0/,newAPA)}
if ($0 ~ /mysqlversion/) {gsub(/2.0/,newSQL)}
} 1' file.terra