Как заменить все дублирующие строки
Не могу разобраться, как сделать так, чтобы скрипт Котлин при поиске строк заменял все найденные одинаковые строки. На данный момент скрипт делает только одну замену (допустим в файле 3 дублирующие строки, скрипт меняет только одну, а нужно чтобы заменял все найденные дублирующие строки).
Суть скрипта такая, сначала он берет текст из файла номер 1 (ищет по строкам которые начинаются с INGAME и REPORT ENGLISH), по этому тексту делает поиск в файле номер 2 (hml), когда находит такой же текст, рядом с ним будет номер, затем по этому номеру делает поиск в файле номер 3, и ниже найденного номера будет текст который скрипт копирует и вставляет вместо текста в файле номер 1.
В целом скрипт нормально справляется, но оставляет много дублирующего текста в файле номер 1 (заменяет только один дубликат, а нужно чтобы всё).
Пробовал вместо replace писать replaceAll, не помогает.
Вот код:
fun main(args: Array<String>) {
val reader1 = File("src/main/resources/file1.txt")
.bufferedReader()
val inputStr1 = reader1.use(BufferedReader::readText)
reader1.close()
val inputSeq1 = "(?<=(INGAME|REPORT) ENGLISH:\\s).+$"
.toRegex(RegexOption.MULTILINE)
.findAll(inputStr1)
.map { it.value }
.flatMap { it.split("|") }
val reader2 = File("src/main/resources/file2.xml")
.bufferedReader()
val inputStr2 = reader2.use(BufferedReader::readText)
reader2.close()
val inputSeq2 = "<translation_record.+/>"
.toRegex(RegexOption.MULTILINE)
.findAll(inputStr2)
.map { it.value }
val inputSeq = inputSeq1.map { subStr ->
val regex = "[{}*]".toRegex().replace(subStr) { "\\${it.value}" }
.toRegex(RegexOption.IGNORE_CASE)
val line = inputSeq2.find { regex.containsMatchIn(it) }
Pair("\\d+".toRegex().find(line ?: "")?.value?.toIntOrNull() ?: 0, subStr)
}.filter { it.first > 0 }.sortedBy { it.first }.distinctBy { it.first }
//println(inputSeq.map { it.first })
val reader3 = File("src/main/resources/file3.txt")
.bufferedReader()
val inputStr3 = reader3.use(BufferedReader::readText)
reader3.close()
val inputSeq3 = inputStr3.split("\\n{2,}|\\s{4,}".toRegex())
.filter { "^STR-".toRegex(RegexOption.MULTILINE).containsMatchIn(it) }
.map {
val (first, second) = it.split('\n')
Pair("\\d+".toRegex().find(first)?.value?.toIntOrNull() ?: 0, second)
}
val inputIter = inputSeq.iterator()
var outputStr = inputStr1
var old = inputIter.next()
for (new in inputSeq3) {
if (!inputIter.hasNext()) break
if (new.first == old.first) {
outputStr = outputStr.replace(old.second, new.second)
old = inputIter.next()
}
}
val writer = File("src/main/resources/file4.txt").bufferedWriter()
writer.use { it.write(outputStr) }
writer.close()
}
Также скрипт на последнем этапе (при вставке в файл 1) затрагивает строки, которые НЕ начинаются с INGAME и REPORT ENGLISH. Хотя должен только их менять.