在文本文件中查找/替换两个单词之间的字符串

8

我有一个像这样的文本文件:

line 1
line 2
line 3
CommandLine arguments "render -h 192.168.1.1 -u user -p pass"
line 5

我想替换IP地址并原地写入文件。棘手的部分是,行可能按不同顺序排列,命令行参数可能以不同的顺序编写。所以我需要找到以CommandLine开头的行,然后替换从-h到下一个-之间的字符串。
到目前为止,我能够用以下代码获取旧的IP地址,但我不知道如何替换它并写入文件。我是Python初学者。
with open(the_file,'r') as f:
    for line in f:
        if(line.startswith('CommandLine')):
            old_ip = line.split('-h ')[1].split(' -')[0]
            print(old_ip)

要在读取文件的同时对其进行原地修改,请参考"是否可以原地修改文件中的行?" - Niayesh Isky
2个回答

2
使用fileinput尝试这个。
import fileinput, re
filename = 'test_ip.txt'
with fileinput.FileInput(filename, inplace=True, backup='.bak') as file:
    for line in file:
        print(re.sub("-h \S+ -u", "-h YOUR_NEW_IP_HERE -u", line), end='')

谢谢,那个可行!你为什么更喜欢使用FileInput()而不是input()呢? - Elliott B
input() 也会起同样的作用,更多细节请查看文档。 - bhansa
1
这让我走上了正确的轨道。为了使它更加健壮,处理参数的顺序不同,我将该行改为print(re.sub('-h [\w.]+', '-h ' + new_ip, line), end='') - Elliott B

0
你可以尝试以下代码来替换字符:

with open(the_file,'r') as f:
   for line in f:
      if(line.startswith('CommandLine')):
           replaced_line = re.sub('(?<=-h).*?(?=-u)', 'NEW IP',line, 
                       flags=re.DOTALL)

它将使该行变成:

CommandLine arguments "render -h NEW IP -u user -p pass"

你可以尝试使用fileinput来替换旧的IP地址,并将新的IP地址写入文件。

更新:

问题出在if条件上,现在通过我的第一个正则表达式,你可以管理它:

for line in fileinput.input("file.txt", inplace=True):
    print(re.sub('(?<=-h).*?(?=-u)',' newIp ',line.strip()), end='\n')

注意:在新的IP地址中添加空格


在你的第一个方法中,我该如何用 replaced_line 覆盖原始文件中的那一行?在这种情况下,我不能使用第二个选项,因为文本文件中参数的顺序可能不同,而我只需要替换 IP。 - Elliott B
此外,按照您所写的第二种方法会从文本文件中删除所有其他行。 - Elliott B
@ElliottB 我明白了我的代码问题,它出在条件上。所以我使用正则表达式解决了这个问题。无论如何,很高兴听到你找到了正确的答案。我已经更新了我的回答,你可以看一下。 - Vikas Periyadath

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接