在文件中的不同命令中进行多个ip替换

时间:2014-06-04 12:33:54

标签: python

我有一组存储在文件中的命令

ip ospf db area 0.0.0.0 rtr <ip> adv <ip> 
ip ospf db area 0.0.0.0 rtr <ip> self-originate 
ip ospf db area 0.0.0.0 rtr <ip>
ip ospf db area 0.0.0.0 rtr adv <ip> 
ip ospf db area 0.0.0.0 rtr orig 
ip ospf db area 0.0.0.0 rtr

需要用以下命令替换上面的命令: -

ip ospf db area 0.0.0.0 rtr 222.0.0.1 adv 10.0.0.1 
ip ospf db area 0.0.0.0 rtr 222.0.0.1 self-originate 
ip ospf db area 0.0.0.0 rtr 100.0.0.1 
ip ospf db area 0.0.0.0 rtr adv 50.0.0.1 
ip ospf db area 0.0.0.0 rtr orig 
ip ospf db area 0.0.0.0 rtr

有人可以建议一种方法吗?所有的ips都不同,这些类型的命令还有很多。必须解析整个文件,并且需要用适当的值替换ips。

3 个答案:

答案 0 :(得分:1)

正如DarinDouglass所说,你需要有办法区分IP。如果文件具有固定格式,并且您希望将第一次出现的<ip>替换为某个IP,第二次出现另一个IP,依此类推,请执行以下操作:

import re

def replacer(l):
    i = iter(l)
    replace = lambda x: i.next()
    return replace

# example usage:
print re.sub("e", replacer(["1", "2", "3"]), "This is a sentence")

# prints "This is a s1nt2nc3"

re.sub接受返回字符串的自定义函数。 replacer返回一个函数,该函数在调用时返回列表l中的下一个元素。

如果您提供有关问题的其他详细信息,我可以为您提供更多帮助。

答案 1 :(得分:0)

如果您知道有序的IP地址列表:

ip_token = "<ip>" # your ip positionning substring
ip_list  = ["127.0.0.1","127.0.0.2",...] # your ip list

with open("myfile","r+") as f:
    old = f.read()
    f.seek(0)

    #loop through file content
    for line in old:
        modified_line = line

        #replace the tokens by the ips
        while "<ip>" in modified_line:
            modified_line = modified_line.replace(ip_token,ip_list.pop(0),1)

        f.write(modified_line) 

答案 2 :(得分:0)

将ips存储为元组列表。每个元组代表一行,元组中的每个IP代表IP被替换的顺序。

然后浏览您的文件。

对于每一行,使用enumerate获取其在文件中的位置,找到<ip>的位置,并将其替换为使用索引从元组列表中获取的元组。

如果元组列表中没有该索引的元素,则表示您无需替换。

这种方法的问题在于,您需要在元组列表中包含与行一样多的项目,如果您要替换的文件很大,这将是浪费。为避免这种情况,您可以使用字典,其中键是行号,值是表示要替换的IP的元组。