Как правильно найти заменить содержимое файла в Юлии? - PullRequest
1 голос
/ 08 мая 2019

Я пытаюсь прокомментировать все идентификаторы, кроме необходимого идентификатора файла.

содержимое файла ids.txt:

name="app1"
id="123-45-678-90"
#id="234-56-789-01"
#id="345-67-890-12"
#id="456-78-901-23"
#id="567-89-012-34"
#id="678-90-123-45"

содержимое файла write_correct_id.jl:

#required id
req_id = "id=\"456\-78\-901\-23\""

#read file content to array
ids_array
open("/path/to/ids.txt", "r") do ids_file
ids_array = readlines(ids_file)
end

#comment all lines starting with "id =" and un-comment the line with required id
id_pattern ="^id="
id_regex = Regex(id_pattern)

for line in ids_array
if occursin(id_regex, line)
replace (line, "id" => "#id")
elseif occursin(req_id, line)
replace(line, "#$req_id" => "req_id)
end
end

#write back the modified array to the file
open("/path/to/ids.txt", "w") do ids_file
for line in ids_array
write("$line\n")
end
end

Элементы, начинающиеся с id (т. Е. ^ Id =), не распознаются.

, пожалуйста, помогите мне!

1 Ответ

1 голос
/ 08 мая 2019

Проблема с вашим кодом в том, что строки неизменны в Юлии, поэтому replace не изменяет строку, а создает новую.

Вот мое предложение о том, как бы я написал ваш код (обратите внимание на некоторые другие небольшиеразличия в моей реализации, например, count гарантирует, что мы делаем только одну подстановку, так как в общем случае в одной строке может быть несколько вхождений шаблона; также startswith в общем случае должен быть быстрее, чем occursin в вашем случае использования):

req_id = "id=\"456-78-901-23\""
id_pattern = "id="

lines = readlines("idx.txt")

open("idx.txt", "w") do ids_file
    for line in lines
        if startswith(line, "#$req_id")
            println(ids_file, replace(line, "#$req_id" => req_id, count=1))
            # or even:
            # println(ids_file, chop(line, head=1, tail=0))
        elseif startswith(line, id_pattern)
            println(ids_file, replace(line, "id" => "#id", count=1))
            # or even:
            # println(ids_file, "#"*line)
        else
            println(ids_file, line)
        end
    end
end
...