заменить строку, содержащую шаблон поиска, на другую строку - PullRequest
0 голосов
/ 16 марта 2012

Я хотел бы заменить каждую строку, начинающуюся с определенного выражения (пример: <Output>), тем, каким должен быть выходной путь.Я нашел и начал работать скрипт на python, который заменяет одну строку другой, в каждом случае в файле - что-то вроде:

text = open( path ).read()
if output_pattern in text:
   open( path, 'w' ).write( text.replace( pattern, replace ) )

Однако я хотел бы заменить text.replace( pattern, replace ) чем-то, что заменяетвся строка, содержащая pattern с replace.Я попробовал некоторые вещи и потерпел неудачу.

Примечание: я могу читать, но не совсем писать Python ...

Одна из моих ошибок заменила шаблон строкой.На самом деле, он заменил весь файл только шаблоном замены, столько раз, сколько было нужно ... Да, не смешно, так как я выполнял рекурсивный поиск (и предыдущая попытка заменить одну строку на другую работала отлично,поэтому я был храбрым и установил свой целевой каталог как корень того, с чем я хочу работать)

Есть другие замечательные примеры, которые читают построчно и записывают в выходной файл, а затем копируют выходной файл ввходной файл, но я получил ошибку при этом.

Я действительно не хочу использовать регулярные выражения, потому что шаблоны, которые я могу хотеть искать (и особенно то, что я хочу заменить) (может содержать)много специальных символов, включая обратную косую черту, но при необходимости их можно экранировать.

1 Ответ

3 голосов
/ 16 марта 2012

Заменить строки на replace, если они начинаются с pattern:

text = open(path).read()
new_text = '\n'.join(replace if line.startswith(pattern) else line
                                for line in text.splitlines())
open(path, 'w').write(new_text)

Или оптимизированы для использования памяти, и с использованием оператора with, что немного более идиоматично:

with open(input_path) as text, open(output_path, 'w') as new_text:
    new_text.write(''.join(replace if line.startswith(pattern) else line
                                for line in text))

Вы должны убедиться, что replace содержит символ новой строки (\n), чтобы последний пример работал так, как вы ожидаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...