我有一个我需要修改的文件。我需要修改的部分(不是整个文件)类似于下面显示的属性。问题是我只需要替换部分“值”,即“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")
感谢这两个回复 - 每个人都帮了我很多!
答案 0 :(得分:8)
使用闭包作为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)
}
}
答案 1 :(得分:3)
为了快速回答,我会走这条路:
patterns = [pattern1 : constantPart1ConfigurablePart1,
pattern2 : constantPart2ConfigurablePart2,
pattern3 : constantPart3ConfigurablePart3]
def myFile = new File(".", "inputs/fileInherited.txt")
StringBuffer updatedFileText = new StringBuffer()
def ls = System.getProperty('line.separator')
myFile.eachLine{ line ->
patterns.each { pattern, replacement ->
line = line.replaceAll(pattern, replacement)
}
println line
updatedFileText.append(line).append(ls)
}
myFile.write(updatedFileText.toString())