2017-02-13 8 views
1

設定ファイルを古いバージョンにはない行でどのように更新できますか?古い設定ファイルと新しい設定ファイルをマージする

例:

のconfig.cfg:

parameterA=0 
parameterB=1 
parameterC=0 

config.cfg.sample:

parameterA=0 
parameterB=0 
parameterC=0 
parameterD=0 

私が何をしたいのかがのcon​​fig.cfgファイルを更新するコマンドを実行することですconfig.cfg.sampleファイルを使用して、結果を次のように取得します。

parameterA=0 
parameterB=1 
parameterC=0 
parameterD=0 

新しい行は必ずしも最後になるわけではありません。既存の行は変更しないでください。例えば

update_config.sh config.cfg config.cfg.sample 

ありがとうございました!

+0

あなたはconfig.cfg.sampleとのconfig.cfgの内容を追加したい場合は、単にコマンド '猫config.cfg.sample >>のconfig.cfgを使用することができます' – warl0ck

+0

こんにちは、thxですが、リクエストされた結果は作成されません。多くの行を複製しますが、重複してはいけません。 –

+0

その場合は、この方法がベストではないかもしれませんが、 'cat config.cfg.sample >> config.cfg | uniq> config.cfg' – warl0ck

答えて

1

この結合にはループは必要ありません。 この目的のために、joinというツールがあります。 このコマンドを実行すると、必要な結果が得られます。あなたが最後にカットを削除した場合

join -a1 -a2 -t= b.txt bb.txt |cut -d= -f1-2 

次の2つのファイルの間の「比較」を参照してくださいすることができます。

テスト:

$ cat b.txt 
parameterA=0 
parameterB=1 
parameterC=0 

$ cat bb.txt 
parameterA=0 
parameterB=0 
parameterC=0 
parameterD=0 

$ join -a1 -a2 -t= b.txt bb.txt |cut -d= -f1-2 
parameterA=0 
parameterB=1 
parameterC=0 
parameterD=0 
+0

これは最良の答えと思われます。シンプルで正確に動作します。ありがとうございました。 –

1

これは作業を行う必要があります。 「config.cfg」は元のファイル、「config.new」は新しいキーワードを取得するファイルです。

#!/bin/sh 

exec 0<config.new 
while read line; do 
    parname=$(echo "$line" |cut -d= -f1) 
    # echo " (debug) new parname=$parname" 
    grep "^$parname" config.cfg || echo $line >> config.cfg 
done 

この設定の根拠は次のとおりです。 (カットを介して)パラメータ名を抽出し、このパラメータ名が元のファイルに含まれているかどうかを判断し、そうでない場合はファイルに追加します。

ただし、新しいパラメータは常に元のファイルに追加されます。最終的なファイルをソートに渡すことは、これが必要な場合にはおそらく助けになります。

注意:おそらくcutコマンドは、シェルがその種のフィールド抽出を行うことができるため、避けることさえできます。私は物事を単純に保つことを選んだ。

+0

こんにちは、これはよりシンプルなので、私はこれから作業すると信じています。また、config.cfgに含まれているすべてのもの(例:コメントの追加など)は保持されますが、config.newは保持しません。ありがとう。 –

関連する問題