2010-01-12 2 views
0

Im есть файл XML конфигурации под названием solrconfig.xml, он имеет этот раздел в середине этого:сценария оболочки, чтобы найти и заменить раздел в 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 ################################--> 

У меня есть скрипт, который я хочу использовать для замены этот раздел в случае, когда я настраиваю сервер как подчиненный. Я работаю, за исключением того, что он помещает новый раздел в конец файла вместо того же места, что и старый, вы можете помочь мне настроить его, чтобы заменить его в том же месте.

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 

ответ

1

В вашем блоке для начала региона ({skip = 1}) добавьте свои заявления о печати. Логика:

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 

решение выглядит примерно так:

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 

Однако, лучшим решением может быть использование лучшего языка сценариев с поддержкой XML (например, Python, Ruby или Tcl) и воспользоваться способностью манипулировать DOM.

+0

спасибо, согласен! – Joelio

Смежные вопросы