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でこれを実際に行う方法を知っている人はいますか?

EDIT -- 期待される出力を定義する

サンプル行を含むファイルは、各行の「ConfigurablePart」が提供された更新されたテキストに置き換えられるように更新する必要があります。私の醜い解決策では、ConfigurablePart1 を置き換えるために 1 回、ConfigurablePart2 のために 1 回、最後に ConfigurablePart3 のために、メソッドを 3 回呼び出す必要があります。これにもより良いアプローチがある可能性があります!!!

*更新-私が本当に必要としていた答え*

他の人が同様の問題に遭遇した場合に備えて、私が尋ねたグルーヴィーなコードの改善は、受け入れられた回答に最もよく反映されています。ただし、私の問題は完全には解決しませんでした。一致した行の一部のみを置き換える必要があったため、後方参照とグループを使用する必要がありました。これを機能させる唯一の方法は、次のように 3 つの部分からなる正規表現を定義することでした。

(.*)(matchThisPart)(.*)

それが完了すると、次を使用できるようになりました。

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

両方の返信に感謝します - それぞれが私を大いに助けてくれました!

4

2 に答える 2