2016-04-06 27 views
1

Ich habe zwei Dateien File_A und File_B enthalten Schlüssel/Wert-Paarevergleichen zwei Eigenschaftsdateien und ersetzen Werte

File_A

ANT_HOME=/opt/apps/apache-ant 
HIBERNATE=/opt/apps/some/path/to/hibernate 
BATCHDAEMON=false 
BATCHEDIT_ENABLED=false 
BATCHENABLED=false 
---- 
---- 
<120 lines) 

File_B

ANT_HOME=$ANT_DIR 
HIBERNATE=$HIBERNATE_LOCATION 
---- 
DBCONNECTION= 
DBNAME= 
DBUSER= 
DBPASS= 
DBPORT= 
DBSERVER= 

<70 lines> 

Ich möchte Schlüssel in File_A vergleichen Schlüssel in File_B und wenn es eine Übereinstimmung gibt, ersetzen Sie Werte von File_B in file_A

Ende Ergebnis

File_A ANT_HOME = $ ANT_DIR Hibernate = $ HIBERNATE_LOCATION DbConnection = DBNAME = DBUSER = DBPASS = DBPort = DBSERVER = .... < 120 Linien>

auch einige der Werte haben "=" in ihnen
zum Beispiel

SOME_PASSWD=Qwcnyt2-49zstyq4= 

also habe ich regexp verwendet, um das erste Auftreten von Werten vor "="

zu bekommen Ich benutze awk, um zu sehen, ob ich das gewünschte Ergebnis bekomme, aber ich bin nicht in der Lage, Substitution richtig zu bekommen.

awk 'BEGIN {FS = "/[^=]*/"} FNR==NR { array[$1]=$2; next } $1 in array { sub ($1, array[$2])} 1' File_B, File_A >> some_tempfile.ini 

Dank im Voraus

Antwort

0

Die Idee zu analysieren File_B zuerst gut ist.

Wenn die Feldtrenn (FS) zu = gesetzt ist, dann 1 $ direkt gibt den Schlüssel für die aktuelle Zeile. Dies führt zur Verwendung eines assoziativen Arrays.

Geben Sie diese getestete Version einen Versuch:

awk 'BEGIN { FS="="; } { if (NR==FNR) { pkeynline[$1]=$0; } else if (pkeynline[$1]) { print pkeynline[$1]; } else { print; } }' 

Der Test:

$ cat File_A 
ANT_HOME=/opt/apps/apache-ant 
HIBERNATE=/opt/apps/some/path/to/hibernate 
BATCHDAEMON=false 
BATCHEDIT_ENABLED=false 
BATCHENABLED=false 
SOME_PASSWD= 

$ cat File_B 
ANT_HOME=$ANT_DIR 
HIBERNATE=$HIBERNATE_LOCATION 
SOME_PASSWD=Qwcnyt2-49zstyq4= 
UNIQ_KEY_FILEB=/home/life/is/great 

$ awk 'BEGIN { FS="="; } { if (NR==FNR) { pkeynline[$1]=$0; } else if (pkeynline[$1]) { print pkeynline[$1]; } else { print; } }' File_B File_A > some_tempfile.ini 

$ cat some_tempfile.ini 
ANT_HOME=$ANT_DIR 
HIBERNATE=$HIBERNATE_LOCATION 
BATCHDAEMON=false 
BATCHEDIT_ENABLED=false 
BATCHENABLED=false 
SOME_PASSWD=Qwcnyt2-49zstyq4= 
+0

, die schön gearbeitet, vielen Dank – TechArch

Verwandte Themen