Замена строки между двумя символами в файле - PullRequest
0 голосов
/ 08 марта 2020

У меня есть строка в моем файле свойств, как показано ниже

line = "variables=ORACLE_BASE_HOME=/u02/test/oracle/landscape/1/db_50,DB_UNIQUE_NAME=cdms,ORACLE_BASE=//u02/test,PDB_NAME=,DB_NAME=cdms,ORACLE_HOME=/u02/test/product/19/db_21,SID=ss"

Я хотел бы заменить следующую строку другим значением:

DB_NAME=cdms -> DB_NAME=abc

У меня есть код ниже, однако, похоже, что он не работает, как ожидалось.

f = fileinput.FileInput(rsp_file_path)
for line in f:
    re.sub(",DB_NAME=(.*?),", "abc", line, flags=re.DOTALL)
f.close()

Если кто-то может пролить свет, я действительно ценю это

Спасибо.

Ответы [ 2 ]

0 голосов
/ 08 марта 2020

Это должно быть:

re.sub("(,DB_NAME=)(.*?),", "\g<1>abc,", line, flags=re.DOTALL)

или с использованием необработанной строки:

re.sub(r"(,DB_NAME=)(.*?),", r"\1abc,", line, flags=re.DOTALL)

Это потому, что документация для re.sub() сообщает:

В аргументах repl строкового типа в дополнение к экранированию символов и обратным ссылкам, описанным выше, \ g будет использовать подстроку, совпадающую с именем группы, как определено синтаксисом (? P ...). \ g использует соответствующий номер группы; \ g <2>, следовательно, эквивалентно \ 2, но не является неоднозначным в замене, такой как \ g <2> 0. \ 20 будет интерпретироваться как ссылка на группу 20, а не ссылка на группу 2, за которой следует буквальный символ '0'. Обратная ссылка \ g <0> подставляет во всю подстроку, совпадающую с RE.

В вашем случае (,DB_NAME=) - это первая захваченная группа, к которой вы обращаетесь с помощью \g<1>.

0 голосов
/ 08 марта 2020

вы можете использовать использовать string.replace ()

s.replace('DB_NAME', 'cdms', 1).replace('DB_NAME', 'abc', 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...