6

我有一个需要修改的文件。我需要修改的部分(不是整个文件),类似于下面显示的属性。问题是我只需要替换“值”的一部分,如果你愿意的话,“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。也可能有更好的方法!

*已更新 -- 回答我真正需要的 *

如果其他人遇到类似的问题,我询问的常规代码改进最好反映在接受的答案中。但是,对于我的问题并没有完全解决我的问题。由于我只需要替换一部分匹配的行,我需要使用反向引用和组。我可以完成这项工作的唯一方法是定义一个由三部分组成的正则表达式,例如:

(.*)(matchThisPart)(.*)

完成后,我就可以使用:

it.replaceAdd(~/$pattern/, "\$1$replacement\$3")

感谢这两个回复 - 每个回复都帮了我很多忙!

4

2 回答 2

8

使用闭包作为参数可以使其更加冗长。这是如何做到的:

//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)
   }
} 
于 2013-06-04T20:44:13.473 回答
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())
于 2013-06-04T19:12:28.830 回答