我有一个包含数千行代码的文本文件,我想按如下方式替换某些元素:
file1中的文字:
serverfarm host foobar2:443
failaction reassign
probe tcp111-probe
rserver foobar1 443
rserver foobar2 443
包含我想要附加到原始文件文本(file2)的附加信息的文本:
rserver host foobar1
ip address 1.1.1.1
inservice
rserver host foobar2
ip address 1.1.1.2
inservice
因此我们可以看到在原始文件中rserver
行没有捕获IP地址,但我在另一个文件中有此信息。
在:
rserver foobar1 443
之后(所需的输出)
rserver foobar1 443
< ---保留原始文字
rserver host foobar1
< ---应在原始文本
ip address 1.1.1.1
inservice
原始文本字符串"rserver foobar1 443"
(删除第3个文本块)与替换文本"rserver host foobar1"
的第一行之间存在直接映射(删除第2个文本块=主机)。
是否可以使用python字典或类似方法执行此操作?如果有人能告诉我如何在Python中执行此操作,我会很感激,然后我会在执行类似的任务时使用这种方法。
答案 0 :(得分:1)
我们的想法是编写一个自定义解析器/翻译器,如下所示:
replacements = {}
with open('file2.txt') as f:
for l in f:
l = l.strip()
if l.startswith('rserver'):
server_header = l
server = l.split()
server_name = server[2]
elif 'ip address' in l:
ip_address = l
elif 'service' in l:
service = l
replacements[server_name] = (server_header, ip_address, service)
with open('file1.txt') as f, open('out.txt', 'w') as out:
for l in f:
l = l.rstrip()
if 'rserver' in l:
server = l.split()
server_name = server[1]
out.write(l + '\n')
out.write(' ' + replacements[server_name][0] + '\n')
out.write(' ' + replacements[server_name][1] + '\n')
out.write(' ' + replacements[server_name][2] + '\n')
else:
out.write(l + '\n')
输出 (out.txt)
serverfarm host foobar2:443
failaction reassign
probe tcp111-probe
rserver foobar1 443
rserver host foobar1
ip address 1.1.1.1
inservice
rserver foobar2 443
rserver host foobar2
ip address 1.1.1.2
inservice
答案 1 :(得分:1)
是的,您可以使用字典或defaultdict
映射第二个文件中的服务器名称及其详细信息列表(IP和服务状态),并在写入新文件时插入这些详细信息:
from collections import defaultdict
import re
d = defaultdict(list)
with open('file1.txt') as f1, open('file2.txt') as f2, open('output.txt', 'w') as f3:
for line in f2:
if 'host' in line:
key = line.strip().replace('host ', '')
d[key].append(' ' + line) # match indentation in file1 with leading spaces
for line in f1:
f3.write(line if '\n' in line else line+'\n')
if 'rserver' in line:
f3.writelines(d[re.sub(r'\s\d+', '', line.strip())])
output.txt的:
serverfarm host foobar2:443
failaction reassign
probe tcp111-probe
rserver foobar1 443
rserver host foobar1
ip address 1.1.1.1
inservice
rserver foobar2 443
rserver host foobar2
ip address 1.1.1.2
inservice
答案 2 :(得分:0)
如果您正在运行Linux发行版,那么您可以使用awk命令并使用grep管道。
如果你想要一个python的解决方案,那么复杂性将是O(n.m),其中n是第一个文件中的行数,m是第二个文件中的行数。
python中的算法:
open a new file, file3
file1 = f.open(path to file 1)
n = number of lines in file1
file2 = f.open(path to file 2)
m = number of lines in file 2
for i in range(n):
r = readline(file1)
copy line into file3
convert r to array and check to see if r[0] is "rserver"
if r[0]=="rserver" then:
for j in range(m):
k = readline(file2)
convert k to array and check to see if k[0] is "rserver"
if k[0]=="rserver" then:
merge required number of lines from file2 into file3
increment j by x
close all files
希望这有帮助!