2012-02-21 5 views
3

Есть много потоков на поиске заменить текст для python, но я думаю, что мой вопрос отличается.найти строку, заменить несколько строк

У меня есть куча файлов Java с

System.out.println("some text here"); 

Я пытаюсь написать питон скрипт, который заменит их все

if (logger.isInfoEnabled()) { 
    logger.info("some text here"); 
} 

Для этого я попробовал:

def findReplace(fileName, sourceText, replaceText): 
    file = open(fileName, "r") #Opens the file in read-mode 
    text = file.read() #Reads the file and assigns the value to a variable 
    file.close() #Closes the file (read session) 

    file = open(fileName, "w") #Opens the file again, this time in write-mode 
    file.write(text.replace(sourceText, replaceText)) #replaces all instances of our keyword 
    # and writes the whole output when done, wiping over the old contents of the file 
    file.close() #Closes the file (write session) 

и передать:

filename=Myfile.java, sourceText='System.out.println', replaceText='if (logger.isInfoEnabled()) { \n' \logger.info' 

Однако я изо всех сил пытаюсь получить закрытие «на замену». Он должен быть обернут вокруг той же выходной строки, которая уже существует. Какие-нибудь советы?

Спасибо.

ответ

4
import re 

sourceText = 'System\.out\.println\(("[^"]+")\);' 

replaceText = \ 
r'''if (logger.isInfoEnabled()) { 
    logger.info(\1); 
}''' 

re.sub(sourceText, replaceText, open(fileName).read()) 

Это не идеально - она ​​будет работать только, если строка не содержит спасся кавычки, т.е. \" - но, надеюсь, он должен сделать трюк.

+0

Вы можете использовать r '' 'System \ .out \ .println \ ("(. +?) (? =" \);) "\);' '' Лениво взять все символы до закрытия «); который должен учитывать любые скрытые кавычки внутри. – hexparrot

+0

Несомненно, ленивый поиск частично решает проблему (хотя я не уверен, что взгляд действительно необходим?). Всегда есть проблема с тем, что строка содержит '\";) 'хотя. – bluepnume

+0

@hexparrot Я не могу заставить вашу работу работать. – dublintech

3

У вас наверняка возникнут проблемы с этим, потому что выполнять замены вокруг соответствующих разделителей сложно. Один из подходов, который дает мне больше смысла - по нескольким причинам, - это определить новую функцию java log_if_enabled, а затем просто заменить System.out.println на log_if_enabled. Таким образом, вам не нужно беспокоиться о том, чтобы выполнить какую-либо причудливую привязку. Кроме того, инкапсуляция оператора if в функцию DRY.

+0

Нет, это не сработает. Вам нужно проверить, включен ли log4j, прежде чем какая-либо конкатенация строк увидит: http: //logging.apache. org/log4j/1.2/manual.html. – dublintech

+1

@dublintech: Что говорит senderle, так это то, что вы должны написать новую функцию log_if_enabled (или то, что вы хотите назвать), чтобы * it * делал чек. is, ваш оператор 'if' должен быть в этой новой функции. –

+0

Да, но на этом этапе произошла конкатенация и нанесенный урон. Он будет вызываться как log_if_enable (« my output = "+ output +", на этом сервере = + сервер имя); Этот подход работает только в том случае, если вы никогда не конкатенируете. Обычно вы регистрируетесь. – dublintech

Смежные вопросы