我在一个文件中存储了以下命令集
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替换为适当的值。
发布于 2014-06-04 21:02:05
正如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中的下一个元素。
如果您提供有关您的问题的更多详细信息,我可以提供更多帮助。
发布于 2014-06-04 21:08:14
如果您知道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) 发布于 2014-06-04 21:09:42
将ips存储为元组列表。每个元组表示一行,元组中的每个IP表示替换IP的顺序。
然后遍历你的文件。
对于每一行,使用enumerate获取其在文件中的位置,找到<ip>的位置,并将其替换为使用索引从元组列表中获取的元组。
如果您的元组列表中没有该索引的元素,则意味着您没有要替换的元素。
这种方法的问题是,在元组列表中需要与行一样多的项,如果要替换的文件很大,这是很浪费的。为了避免这种情况,您可以使用字典,其中键是行号,值是表示要替换的is的元组。
https://stackoverflow.com/questions/24037560
复制相似问题