2015-07-02 3 views
-1

У меня есть 2 файла (long.xml и sort.xml файлов) с тем же форматом:Заменить конкретные строки файлов с помощью заводной

<?xml version="1.0" encoding="UTF-8"?> 
<psf version="2.0"> 
<provider id="org.eclipse.team.cvs.core.cvsnature"> 
<project reference="1.0,:pserver:url:/cvs/SynBusStop,Account Interest,Account Interest,branch_A_B"/> 
<project reference="1.0,:pserver:url:/cvs/SynInf,ActiveMQ Libraries,ActiveMQ Libraries,branch_A_B"/> 
<project reference="1.0,:pserver:url:/cvs/SynBusStop,Alert,Alert,branch_B_B"/> 
<project reference="1.0,:pserver:url:/cvs/SynBusStop,Alert Adaptor,Alert Adaptor,branch_A_B"/> 
<project reference="1.0,:pserver:url:/cvs/SynInf,Ant Extensions Syn,Ant Extensions Syn,branch_A_B"/> 
</provider> 
</psf>` 

все в sort.xml должны быть в long.xml.

Я хочу написать script для поиска sort.xml, чтобы обновлять новую информацию от sort.xml до long.xml (обычно обновлять ветви). Это мой сценарий:

def source = new File('Path:\\sort.xml') 
def dest = new File('Path:\\long.xml') 
text = dest.text 
text.eachLine 
{ 

    if(it.contains("/cvs/SynBusStop,Account Interest,")) 
    { 
     println it 
     text = text.replace("branch_A_B", "new_Branch") 
     dest.write(text); 
    } 

} 

`

Но он заменил каждую строку, содержащую branch_A_B. Может ли кто-нибудь помочь мне в этом случае, я новичок в Groovy, спасибо вам заранее.

+0

Я предполагаю, что это не путь ... XML-синтаксис кажется лучшей идеей. – Opal

+0

Согласен, это действительно не тот маршрут, который нужно взять ... Разберите оба файла ('XmlSlurper'?), А затем обработайте один из них. –

+1

Можете ли вы показать свои входы и ожидаемые результаты? Может быть, кто-то может придумать не хрупкое решение? –

ответ

0

В вашем коде у вас есть text = text.replace("branch_A_B", "new_Branch"), который действительно заменит все вхождения во всем файле.

Если вы хотите продолжить свою стратегию, а не испытывать синтаксический анализ XML, попробуйте заменить строку за строкой. Что-то вроде этого:

Защиту Strin = "" " ` """

def strOut =""; 

    strIn.eachLine{ 
     println "-->"+it 
     if(it.contains("/cvs/SynBusStop,Account Interest,")) 
     { 
      it = it.replace("branch_A_B", "new_Branch") 
      println "-->CHANGED: "+it 
     } 
     strOut+=it+"\n"; 
    } 

    println "Result: "+strOut 

, который выводит:

--> 
-->   <?xml version="1.0" encoding="UTF-8"?> 
-->   <psf version="2.0"> 
-->   <provider id="org.eclipse.team.cvs.core.cvsnature"> 
-->   <project reference="1.0,:pserver:url:/cvs/SynBusStop,Account Interest,Account Interest,branch_A_B"/> 
-->CHANGED:    <project reference="1.0,:pserver:url:/cvs/SynBusStop,Account Interest,Account Interest,new_Branch"/> 
-->   <project reference="1.0,:pserver:url:/cvs/SynInf,ActiveMQ Libraries,ActiveMQ Libraries,branch_A_B"/> 
-->   <project reference="1.0,:pserver:url:/cvs/SynBusStop,Alert,Alert,branch_B_B"/> 
-->   <project reference="1.0,:pserver:url:/cvs/SynBusStop,Alert Adaptor,Alert Adaptor,branch_A_B"/> 
-->   <project reference="1.0,:pserver:url:/cvs/SynInf,Ant Extensions Syn,Ant Extensions Syn,branch_A_B"/> 
-->   </provider> 
-->   </psf>` 
-->  
Result: 
      <?xml version="1.0" encoding="UTF-8"?> 
      <psf version="2.0"> 
      <provider id="org.eclipse.team.cvs.core.cvsnature"> 
      <project reference="1.0,:pserver:url:/cvs/SynBusStop,Account Interest,Account Interest,new_Branch"/> 
      <project reference="1.0,:pserver:url:/cvs/SynInf,ActiveMQ Libraries,ActiveMQ Libraries,branch_A_B"/> 
      <project reference="1.0,:pserver:url:/cvs/SynBusStop,Alert,Alert,branch_B_B"/> 
      <project reference="1.0,:pserver:url:/cvs/SynBusStop,Alert Adaptor,Alert Adaptor,branch_A_B"/> 
      <project reference="1.0,:pserver:url:/cvs/SynInf,Ant Extensions Syn,Ant Extensions Syn,branch_A_B"/> 
      </provider> 
      </psf>` 
0

Проблема с вашим кодом является то, что вы используете метод replace во всем тексте файла. Вы должны делать это только на линии, которую вы хотите его:

def source = new File('Path:\\sort.xml') 
def dest = new File('Path:\\long.xml') 
def newLines = [] 

dest.eachLine { line -> 
    if(line.contains("/cvs/SynBusStop,Account Interest,")) { 
     println line 
     line = line.replace("branch_A_B", "new_Branch") 
    } 
    newLines << line 
} 

dest.withWriter { out -> 
    newLines.each { out.println it } 
} 

Что касается различий между двумя файлами, это во многом зависит, как родовое вы хотите решение быть. Возможно, вы можете решить это в классическом способе с diff and patch. Если файлы невелики, вы можете хранить строки в Map и сравнивать, или вы можете уточнить их processing XML.

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