次のファイル()があります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
場所に応じてファイルパスを変更してください。