Нужен Groovy способ сделать частичные замены файлов

у меня есть файл, который мне нужно изменить. Мне нужно изменить (не весь файл), похожа на свойства, указанные ниже. Проблема в том, что мне нужно только заменить часть "value", "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?

EDIT -- для определения ожидаемого результата

файл, содержащий строки примера, должен быть обновлен таким образом, чтобы "ConfigurablePart" каждой строки был заменен обновленным текстом. Для моего уродливого решения мне нужно будет вызвать метод 3 раза, один раз для замены ConfigurablePart1, один раз для ConfigurablePart2 и, наконец, для ConfigurablePart3. Скорее всего там лучше подходить к этому тоже!!!

*обновлено -- ответ, который сделал то, что мне действительно нужно *

в случае, если другие когда-либо сталкивались с подобной проблемой, улучшения кода groovy, о которых я спросил, лучше всего отражены в принятом ответе. Однако для моей проблемы это не совсем решило мои проблемы. Поскольку мне нужно было заменить только часть совпадающих строк, мне нужно было использовать обратные ссылки и группы. Единственный способ, которым я мог сделать эту работу, это определить трехчастное регулярное выражение типа:

(.*)(matchThisPart)(.*)

как только это было сделано, я смог использовать:

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

Спасибо за оба ответа-каждый помог мне много!

2 ответов


его можно сделать более подробным с использованием закрытия в качестве 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)
   }
} 

для быстрого ответа я бы просто пошел по этому маршруту:

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())