varの値をsedに置き換える方法

varの値をsedに置き換える方法

変数マップがあり、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

関連情報