用groovy替换特定的文件行

用groovy替换特定的文件行,groovy,Groovy,我有两个格式相同的文件(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 Intere

我有两个格式相同的文件(
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>`
`


但它已经替换了包含
分支A\u B
的每一行。在这种情况下,任何人都可以帮助我,我是Groovy的新手,提前谢谢你。

在你的代码中有
text=text.replace(“branch\u a\u B”,“new\u branch”)
,它确实会替换整个文件中出现的所有内容

如果您想继续执行您的策略,而不是体验XML解析,可以尝试逐行替换。大概是这样的:

def strIn=“” ` “”“

哪些产出:

-->
-->         <?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>`
-->
-->         
-->         
-->         
-->         
-->更改:
-->         
-->         
-->         
-->         
-->         
-->         `
-->     
结果:
`

您的代码存在的问题是,您对整个文件文本使用了
替换
方法。您应该只在您想要的线路上进行:

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 }
}
def source=new文件('Path:\\sort.xml')
def dest=新文件('Path:\\long.xml')
def换行符=[]
dest.eachLine{line->
如果(第行包含(“/cvs/SynBusStop,账户利息,”){
打印线
行=行。替换(“分支机构”、“新分支机构”)
}
新行
换行符.each{out.println it}
}

关于这两个文件之间的差异,这在很大程度上取决于您希望解决方案的通用性。也许你可以用一种经典的方法来解决这个问题。如果文件不大,您可以将行存储在
地图中并进行比较,或者您可以使其更具体。

我想这不是解决问题的方法。。XML解析似乎是个更好的主意。同意,这真的不是我们要走的路。。。解析两个文件(
XmlSlurper
?),然后操作其中一个文件。您可以显示输入和预期输出吗?也许有人能想出一个非脆性的解决方案?
-->
-->         <?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>`
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 }
}