変数マップがあり、bashスクリプトで特定の変数の値を動的に置き換える必要があります。私の変数は次のとおりです
array = {
node1 = [
{
"apacheversion" = "1.0"
"mysqlversion" = "2.0"
}
]
node2 = [
{
"apacheversion" = "1.0"
"mysqlversion" = "2.0"
}
]
}
したがって、apacheversionとmysqlversionの値を 'sed'に置き換える必要があります。
"apacheversion" = "new.value" "mysqlversion" = "new.value"
特定のノードでのみ実行する方法はありますか?たとえば、node1のみを交換します。変数の一時ファイルなので、可能でなくても構いません。
ありがとうございます!
答え1
通常、パーサーを使用する方が良いですが、1つのアプローチはawk
.regexでブロックを選択し、その/start/,/end/
ブロックでのみ作業することです。
awk '/node1 = \[/,/\]/ {
if ($0 ~ /apacheversion/) {gsub(/1.0/,"new.version")}
if ($0 ~ /mysqlversion/) {gsub(/2.0/,"new.version")}
} 1' file.terra
たとえば、フィールド区切り文字として定義すると、パターンマッチング+置換を=
使用するのではなく、より一般的でフィールド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