2013-09-23 3 views
1

Я создаю лабораторию для сетевой сертификации. Существует несколько конфигураций для 13 устройств, но поскольку у меня нет таких же устройств, как и материал, я должен внести некоторые изменения в конфигурации.Python: Замените несколько строк несколькими строками в файлах

Я пытался создать скрипт Python, но он не соответствует точно, что мне нужно.

У меня есть файл с изменениями, которые будут сделаны в виде:

находка-это заменить-с этим Теперь конфигурации я должен изменить в первую очередь intarfaces, так это выглядит примерно так (Я удалил некоторые конфигурации Тома сделать его меньше):

interface Serial0 
description Connected to R1 
frame-relay route 102 interface Serial1 201 
frame-relay route 103 interface Serial2 301 
frame-relay route 104 interface Serial4 401 
frame-relay route 105 interface Serial5 501 
frame-relay route 113 interface Serial3 311 
! 
interface Serial1 
description Connected to R2 
frame-relay route 201 interface Serial0 102 
frame-relay route 203 interface Serial2 302 
frame-relay route 204 interface Serial4 402 
frame-relay route 205 interface Serial5 502 
frame-relay route 213 interface Serial3 312 
! 

Где я хочу заменить

Serial0,Serial1/0 
Serial1,Serial1/1 
Serial2,Serial1/2 
Serial3,Serial1/3 
Serial4,Serial1/4 

Или так:

interface Serial0/0 
! 
interface Serial0/0.1 point-to-point 
! 
interface Serial0/1 
! 

Где я хочу заменить

Serial0/0,Serial0/2/0 
Serial0/1,Serial0/1/0 

Прямо сейчас я построчно с помощью этого метода:

def replace_all(text, dic): 
    for i, j in dic.iteritems(): 
     text = re.sub("\\b"+i+"\\b", j, text) 

Моя проблема заключается в том, что Serial0 или Serial0/0 сопоставляются в первый раз и меняются на Serial1/0, но это соответствует Serial1, поэтому я получаю Serial1/1/0. Я пробовал с обеих границ (\ b) и^и $, но он, похоже, не работает; также у меня есть случай, когда его okey должен быть Serial1, но не Serial1/0, но это okey с Serial1.200.

Таким образом, он должен соответствовать именно тому, что я хочу найти, или точно, что я хочу найти + точка и некоторые числа, например. Serial0/1.200

Кто-нибудь знает, как это сделать и может указать мне в правильном направлении?

ответ

0

Вы можете обрабатывать построчно и разорвать петлю:

new_text="" 
for line in lines: 
    new_text= new_text + fix_line(line) 

def fix_line(line): 
    for i, j in dic.iteritems(): 
      new_line = re.sub("\\b"+i+"\\b", j, line) 
      if new_line != line: #line changed stop loop 
       return new_line 
    return line #line didn't match 

print(new_text) 

редактировать: если вы хотите точного совпадения регулярного выражения следует использовать сплит

str_list = line.split(" ") 
if len(str_list) > 4: #case the line has interface 
    process(str_list[4]) 

def process(str_to_match): 
    if str_to_match in dic: 
      return dic[str_to_match] #will get the exact match saved in the dict 
    return str_to_match #not in dict dont replace 
0

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

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