2017-04-15 4 views
0

Ich versuche, [[****]] Platzhalter in einer HTML-Datei mit Werten aus der Eigenschaftendatei zu ersetzen.Ersetzen von Platzhaltern mit SED

Beispielinhalt in der Eingabedatei:

<html> 
<host>[[my_host]]</host> 
<port>[[my_port]]</port> 
</html> 

Beispielinhalt in Eigenschaftendatei:

my_host=linkcmb.com 
my_port=8080 

Meine aktuelle Skript:

#/bin/sh 

property_file=$1 
input_html=$2 
output_html=$3 

IFS="=" 
while read k v || [[ -n "$k" ]]; do 
    test -z "$k" && continue 
    declare $k=$v 
done <"$property_file" 

eval "$(sed 's/\[\[\([^]]\+\)\]\]/${\1}/g' $input_html) >$output_html"; 

Fehler: HTML-Tags sind auch immer bewertet Fehler verursachen.

./some.sh: line 32: html: No such file or directory 
./some.sh: line 33: host: No such file or directory 
./some.sh: line 35: /host: No such file or directory 
.... 
.... 

Alle Hinweise werden sehr geschätzt. Vielen Dank.

+0

add Probeneingangsleitungen und erwartete Ausgabe für Klarheit ... und sed nicht geeignetes Instrument ist, verwenden, um auf HTML-Dateien ... – Sundeep

+0

@Sundeep die Frage aktualisiert Bitte überprüfen Sie – popcoder

+0

IMO, das ist nicht geeignet für bash Scripting und Sed ... Ich habe keine Erfahrung mit der Verwendung von richtigen HTML-Parsern ... für gegebene Probe, 'Sed-F <(Sed 's/^ \ ([^ =] * \) = \ (. * \)/s | \\ [\\ [\ 1 \\] \\] | \ 2 |/'property.txt) ip.html' könnte funktionieren, aber es wird leicht Pause für echte Anwendungsfälle – Sundeep

Antwort

2

Sie können Ihre while-Schleife mit

. "$property_file" 

aber ich weiß nicht wie die eval, ersetzen, und Sie müssen diese Einstellungen nicht erklären.
Sie wollen sed Befehle wie

sed '/=/ s/\([^=]*\)=\(.*\)/s#\\\[\\\[\1\\\]\\\]#\2#g/' "$property_file" 

Viele Schrägstriche, die [[]] eine schwierige Wahl waren.
Sie können diese Befehle verwenden Prozess Substitution mit:

sed -f <(
    sed '/=/ s/\([^=]*\)=\(.*\)/s#\\\[\\\[\1\\\]\\\]#\2#g/' "$property_file" 
     ) "${input_html}" 
+1

Perfekt !! Danke für den Vorschlag. :) – popcoder

-1

Es gibt eine Regex-Option, die in sed fehlt, aber in Perl vorhanden ist. Wenn Sie Perl verwenden können, wird alles zwischen \ Q und \ E maskiert und wörtlich genommen.

Das Skript muss geändert werden, um eine temporäre Perl-Datei zu erstellen, die alle Ersetzungsbefehle enthält. Es wäre so etwas wie dieses:

#/bin/sh 

property_file=$1 
input_html=$2 
output_html=$3 

perlfile="$$.perl" 

IFS="=" 
while read k v || [[ -n "$k" ]]; do 
    test -z "$k" && continue 
    echo "s/\Q[[${k}]]\E/${v}/g;" >> $perlfile 
done <"$property_file" 

perl -p $perlfile $input_html >$output_html 

rm $perlfile 

EDIT: Wenn einer Ihrer Eigenschaften einen Schrägstrich enthält (zB ein Pfadname), können Sie es direkt entweichen in die Eigenschaftendatei:

# input 
<path>[[my_path]]</path> 

# properties 
mypath=dir\\/filename 

# output 
<path>dir/filename</path> 

gleiche mit Backslash:

# input 
<path>[[my_path]]</path> 

# properties 
mypath=dir\\\\filename 

# output 
<path>dir\filename</path> 

Andernfalls müssen Sie Logik, um das Skript hinzuzufügen, dies zu tun.