[英]Replace specific file lines by groovy
我有 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 的新手,在此先感谢您。
在您的代码中,您有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.