首页 > 解决方案 > 如何在 Groovy 中的字符串匹配之前在文件中插入一行

问题描述

我试图读取一个文本文件在一行中找到一个特定的文本,如果匹配,在找到的行之前添加一个新行

所以如果我有一个文本文件

这是问题@12345 的测试字符串

然后我可以搜索@12345 并在之前添加一些内容

@审查

这是问题@12345 的测试字符串

我尝试使用此示例,但只能在匹配后添加行

def file = new File('test.txt')
def raf = new RandomAccessFile(file, 'rw')

def line = raf.readLine()
while (!line.contains("@12345")) {
  line = raf.readLine()
}

raf.writeBytes('@Review')
raf.close()

标签: filegroovy

解决方案


我不建议使用同时写入正在处理的文件的解决方案。相反,您可以应用一种非常简单直接的方法 - 将预期内容写入临时文件,如果您必须覆盖输入文件,请将新临时文件移至旧文件。

考虑以下示例:

import com.google.common.io.Files

def oldFile = new File('test.txt')
def newFile = File.createTempFile("test", UUID.randomUUID().toString())

newFile.withWriter { output ->
  oldFile.eachLine { line ->
    if (line.contains("@12345")) {
      output.write("@Review\n")
    }
    output.write(line)
    output.write("\n")
  }
}

Files.move(newFile, oldFile)

在这里,我们创建一个新的临时文件,我们从输入文件中读取并将内容放入新文件。当我们发现时@12345,我们在该行前面加上一个包含@Review. 最后,我们调用Files.move(newFile, oldFile)此方法处理将内容从一个文件移动到另一个文件,并删除我们在此方法中使用的临时文件。

使用如下文件运行此示例test.txt

lorem ipsum
dolor sit amet
This is a test string for issue @12345
something else

生成以下更新test.txt文件:

lorem ipsum
dolor sit amet
@Review
This is a test string for issue @12345
something else

推荐阅读