我有一组存储在文件中的命令
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。
答案 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的元组。