2010-01-12 7 views
0

Im ont un fichier de configuration XML appelé solrconfig.xml, il a cette section au milieu de celui-ci:pour trouver et section remplacer dans xml

<!--############ BEGIN replication settings DO NOT EDIT ################################--> 
<requestHandler name="/replication" class="solr.ReplicationHandler" > 
<lst name="master"> 
    <str name="replicateAfter">commit</str> 
    <str name="replicateAfter">startup</str> 
    <str name="confFiles">schema.xml,stopwords.txt</str> 
</lst> 
</requestHandler> 
<!--############ END replication settings DO NOT EDIT ################################--> 

J'ai un script shell que je veux utiliser pour remplacer cette section dans le cas où je configure le serveur en tant qu'esclave. Je l'ai fonctionné, sauf qu'il met la nouvelle section à la fin du fichier au lieu de la même place que l'ancien, pouvez-vous m'aider à tordre cela pour le remplacer au même endroit.

if [ -n "$1" ] && [ $1 == "slave" ] 
then 
    rm solrconfig2.xml 
    echo "setting up slave" 
    cat solrconfig.xml | awk ' 
/^<!--############ BEGIN replication/ { skip = 1 } 
/^<!--############ END replication/ { skip = 0; next; } 
{ if (skip == 0) print $0; } 
END { 
    print "<!--############ BEGIN replication settings DO NOT EDIT ################################-->" 
    print "<requestHandler name=\"/replication\" class=\"solr.ReplicationHandler\" >" 
    print "<lst name=\"slave\">" 
    print "<str name=\"masterUrl\">http://solr-master:8983/solr/replication</str>" 
    print "<str name=\"pollInterval\">00:00:60</str>" 
    print "</lst>" 
    print "</requestHandler>" 
    print "<!--############ END replication settings DO NOT EDIT ################################-->" 
} 
' > solrconfig2.xml 
fi 

Répondre

1

Dans votre bloc pour le début de la région ({skip = 1}), ajoutez vos instructions d'impression. La logique est:

if this is the beginning of the special block: 
    set a flag 
    print my replacement 

if this is the end of the special block: 
    unset a flag 

else if the flag is not set: 
    print the current line 

La solution ressemble à ceci:

if [ -n "$1" ] && [ $1 == "slave" ] 
then 
    rm solrconfig2.xml 
    echo "setting up slave" 
    cat solrconfig.xml | awk ' 
/^<!--############ BEGIN replication/ { 
    skip = 1 
    print "<!--############ BEGIN replication settings DO NOT EDIT ################################-->" 
    print "<requestHandler name=\"/replication\" class=\"solr.ReplicationHandler\" >" 
    print "<lst name=\"slave\">" 
    print "<str name=\"masterUrl\">http://solr-master:8983/solr/replication</str>" 
    print "<str name=\"pollInterval\">00:00:60</str>" 
    print "</lst>" 
    print "</requestHandler>" 
    print "<!--############ END replication settings DO NOT EDIT ################################-->" 
} 
/^<!--############ END replication/ { skip = 0; next; } 
{ if (skip == 0) print $0; } 
' > solrconfig2.xml 
fi 

Cependant, une meilleure solution pourrait être d'utiliser un meilleur langage de script avec prise en charge XML (par exemple, Python, Ruby ou Tcl) et profiter de la possibilité de manipuler le DOM.

+0

merci, et d'accord! – Joelio

Questions connexes