сценарий оболочки для поиска и замены раздела в XML - PullRequest
0 голосов
/ 12 января 2010

У меня есть XML-файл конфигурации с именем solrconfig.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 Ответ

1 голос
/ 12 января 2010

В вашем блоке для начала региона ({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.

...