Bashスクリプト:あるファイルの値を別のファイルに置き換える

Bashスクリプト:あるファイルの値を別のファイルに置き換える

次のファイル()がありますone.cnf

KEY1="value1"
KEY4="VALUE4"

別のファイル(two.cnf)は次のとおりです。

USER_HOST="local"
KEY1="abc"
PASS="lorem"
KEY2="ABC"
KEY4="XYZ"

その変数の値を読んでone.cnf置き換えたいと思いますtwo.cnf
だからそれは次two.cnfのように見えます。

USER_HOST="local"
KEY1="value1"
PASS="lorem"
KEY2="ABC"
KEY4="VALUE4"

答え1

使用法awk:ファイル1からキーを読み、ファイル2を置き換えます。

awk 'BEGIN{FS=OFS="="}
     NR==FNR {key[$1]=$2 ; next }
     $1 in key {$2=key[$1]}
     1' one.cnf two.cnf

交換が必要な場合はご利用くださいsponge

awk '<code>' one.cnf two.cnf | sponge two.cnf

または、GNUawk内部でone.cnf削除されないようにコードを少し変更する必要があります。

awk -i inplace 'BEGIN{FS=OFS="="}
     NR==FNR {key[$1]=$2}
     FNR!=NR && $1 in key {$2=key[$1]}
     1' one.cnf two.cnf

-i inplace -v INPLACE_SUFFIX=.bup- サフィックスを使用して元のファイルを.bupバックアップするために使用されます。

答え2

これは、ファイル1の値キーにスラッシュ文字がないと仮定する/簡単なアプローチです。

while IFS="=" read key value; do sed -i "s/^${key}=.*/${key}=${value}/" two.cnf ; done < one.cnf

ここで問題の1つは、2つのファイルのいくつかのキー値が同じであってもファイルを変更することです。変更する必要のないキーでファイルを変更したくない場合は、単純なgrepを追加できます。

while IFS="=" read key value; do grep -xq "${key}=${value}" two.cnf || sed -i "s/^${key}=.*/${key}=${value}/" two.cnf ; done < one.cnf

またはgrepと単一のsedコマンドなしで:

while IFS="=" read key value; do sed -i "/^${key}=/{/^${key}=${value}$/! s/^${key}=.*/${key}=${value}/}" two.cnf ; done < one.cnf

その他の注意事項:

  • 最初のファイルのキーが2番目のファイルにない場合は追加されません。
  • 最初のファイルにはkey = value形式の行のみが含まれており、他の種類の行は含まれていないとします。
  • また、問題が発生した場合に備えて、続行する前に2番目のファイルをバックアップすることをお勧めします。

答え3

#!/bin/bash           
for val in cat one.cnf          
do       
    KEY=`echo $val | cut -d'=' -f1`     
    VALUE=`echo $val | cut -d'=' -f2`    
    EXISTS=`grep -i "$KEY" two.cnf | grep -v grep`     
    if [ -n "$EXISTS" ]; then       
        VALUE2=`echo "$EXISTS" | cut -d'=' -f2`     
        echo "$VALUE-$VALUE2"                
        sed -i 's/'$VALUE2'/'$VALUE'/g' two.cnf     
    fi      
done

場所に応じてファイルパスを変更してください。

関連情報