繁体   English   中英

用 groovy 替换特定的文件行

[英]Replace specific file lines by groovy

我有 2 个文件( long.xmlsort.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 的新手,在此先感谢您。

在您的代码中,您有text = text.replace("branch_A_B", "new_Branch")它确实会替换整个文件中的所有出现。

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

def 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>`

您的代码的问题在于您对整个文件文本使用了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 和 patch经典的方式解决它。 如果文件不大,您可以将行存储在Map并进行比较,或者您可以使其更具体地处理 XML

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM