file - 如何在 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()
解决方案
我不建议使用同时写入正在处理的文件的解决方案。相反,您可以应用一种非常简单直接的方法 - 将预期内容写入临时文件,如果您必须覆盖输入文件,请将新临时文件移至旧文件。
考虑以下示例:
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
推荐阅读
- reactjs - React-Redux 创建操作以表单失败
- go - 附加到循环中的切片
- javascript - Javascript中的循环不一致/被忽略?
- excel - 为什么我关闭 Excel 并打开一个新的 Excel 文件后 VBA Excel 插件代码消失并且不起作用?
- excel-formula - 如何在数组中查找字符串并获取对应的头值?
- jquery - 如何在不与事件相关的情况下从其他 jQuery 函数内部声明 + 调用 jQuery 函数
- linux - 在文本文件中用 \n 替换真正的换行符
- error-handling - 有没有办法在 Blazor 单页应用程序中全局捕获所有未处理的错误?
- corda - Corda - ci-artifactory.corda.r3cev.com 连接被拒绝
- graphql - 如何在 graphql 中使用本地护照