我有一个我需要修改的文件.我需要修改的部分(不是整个文件)类似于下面显示的属性.问题是我只需要替换部分“值”,即“ConfigurablePart”.我收到此文件,因此无法控制其格式.
alpha.beta.gamma.1 = constantPart1ConfigurablePart1 alpha.beta.gamma.2 = constantPart2ConfigurablePart2 alpha.beta.gamma.3 = constantPart3ConfigurablePart3
我用这种方式做了这个工作,虽然我知道这真的很糟糕!
def updateFile(String pattern,String updatedValue) { def myFile = new File(".","inputs/fileInherited.txt") StringBuffer updatedFileText = new StringBuffer() def ls = System.getProperty('line.separator') myFile.eachLine{ line -> def regex = Pattern.compile(/$pattern/) def m = (line =~ regex) if (m.matches()) { def buf = new StringBuffer(line) buf.replace(m.start(1),m.end(1),updatedValue) line = buf.toString() } println line updatedFileText.append(line).append(ls) } myFile.write(updatedFileText.toString()) }
传入模式需要包含在StringBuffer中替换的组.有谁知道如何在Groovy中真正做到这一点?
编辑 – 定义预期输出
需要更新包含示例行的文件,以便每行的“ConfigurablePart”替换为提供的更新文本.对于我丑陋的解决方案,我需要调用方法3次,一次替换ConfigurablePart1,一次用于ConfigurablePart2,最后用于ConfigurablePart3.对此也有更好的方法!
*更新 – 做出我真正需要的答案*
如果其他人遇到类似的问题,我询问的常规代码改进最好反映在接受的答案中.但是,对于我的问题并没有完全解决我的问题.由于我只需要替换部分匹配的行,我需要使用反向引用和组.我能做到这一点的唯一方法是定义一个由三部分组成的regEx:
(.*)(matchThisPart)(.*)
一旦完成,我就可以使用:
it.replaceAdd(~/$pattern/,"\$1$replacement\$3")
感谢这两个回复 – 每个人都帮了我很多!
使用闭包作为args可以使它更加冗长.以下是如何做到这一点:
//abc.txt abc.item.1 = someDummyItem1 abc.item.2 = someDummyItem2 abc.item.3 = someDummyItem3 alpha.beta.gamma.1 = constantPart1ConfigurablePart1 alpha.beta.gamma.2 = constantPart2ConfigurablePart2 alpha.beta.gamma.3 = constantPart3ConfigurablePart3 abc.item.4 = someDummyItem4 abc.item.5 = someDummyItem5 abc.item.6 = someDummyItem6
Groovy代码: –
//Replace the pattern in file and write to file sequentially. def replacePatternInFile(file,Closure replaceText) { file.write(replaceText(file.text)) } def file = new File('abc.txt') def patternToFind = ~/ConfigurablePart/ def patternToReplace = 'NewItem' //Call the method replacePatternInFile(file){ it.replaceAll(patternToFind,patternToReplace) } println file.getText() //Prints: abc.item.1 = someDummyItem1 abc.item.2 = someDummyItem2 abc.item.3 = someDummyItem3 alpha.beta.gamma.1 = constantPart1NewItem1 alpha.beta.gamma.2 = constantPart2NewItem2 alpha.beta.gamma.3 = constantPart3NewItem3 abc.item.4 = someDummyItem4 abc.item.5 = someDummyItem5 abc.item.6 = someDummyItem6
确认文件abc.txt.我没有使用你所做的方法updateFile(),但你可以很好地参数化如下: –
def updateFile(file,patternToFind,patternToReplace){ replacePatternInFile(file){ it.replaceAll(patternToFind,patternToReplace) } }