代码之家  ›  专栏  ›  技术社区  ›  Joelio

在XML中查找和替换节的shell脚本

  •  0
  • Joelio  · 技术社区  · 14 年前

    我有一个名为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 ################################-->
    

    我有一个shell脚本,在将服务器配置为从属服务器的情况下,我想用它来替换这个部分。我有它的工作,除了它把新的部分放在文件的末尾,而不是放在与旧的相同的地方,你能帮我调整这个位置来替换它在同一个地方吗?

    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 回复  |  直到 14 年前
        1
  •  1
  •   Bryan Oakley    14 年前

    在区域开头的块中(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的能力。