在 python 中替换文本文件中特定行的一部分

Replace one part of a specific line in a text file in python

我有一个 .conf 文件,它需要服务器证书的名称和第 51 行和第 52 行中的密钥,如下所示:

http {
    ssl_certificate     /Eya/server_cert/Eya_selfsigned_09-03-2021.crt;
    ssl_certificate_key /Eya/server_cert/Eya_selfsigned_09-03-2021.key;
     }

如果创建的自签名证书文件(server.crtserver.key)与 .conf 文件中给定的名称不同,我只需要替换.conf 文件第 51 行和第 52 行中的名称按以下方式:

ssl_certificate     /Eya/server_cert/server.crt;
ssl_certificate_key /Eya/server_cert/server.key;

现在,我正在阅读 .conf 文件的第 51 行和第 52 行,检查名称是否不同。如果不同,我正在尝试用正确的名称替换名称,如下所示:

if self.nginxConfRadioButton.isChecked():
    cerf = "    ssl_certificate     /Eya/server_cert/"
    cerfkey = "    ssl_certificate_key /Eya/server_cert/"
    searchfile = open("./nginx.conf").readlines()
    f = open("./nginx.conf", "w+")
    for i, line in enumerate(searchfile):
        if i == 50:
            fields = re.split('/Eya/server_cert/|;', line)
            field = fields[1]
            print(field)
            if (field != "server.crt"):
                cnfvalue = self.getNameValue("SERVER_CRT")
                print (cnfvalue)
                line = re.sub(".*\"", cerf + cnfvalue + ";", line)
                print(line)
        f.write(line)
   f.close()

def getNameValue(self, nginxConfValue):
    file = open('./cert.sh', 'r')
    for line in file:
        if nginxConfValue+"=" in line:
            line=line.replace(nginxConfValue+"=\"", "")
            cnfvalue = re.sub("\".*$", "", line).rstrip()
            return cnfvalue
    file.close()

我正在从 getNameValue() 函数中读取自签名证书的名称。 上面代码的输出结果如下:

Eya_selfsigned_09-03-2021.crt
server.crt
    ssl_certificate     /Eya/server_cert/Eya_selfsigned_09-03-2021.crt;

是否可以仅将 Eya_selfsigned_09-03-2021.crt 替换为 server.crt?我哪里错了?

您可以在正则表达式中使用组,它们通过 re.sub 第二个参数中的 \group_number 引用它们:

crt_line = "    ssl_certificate     /Eya/server_cert/Eya_selfsigned_09-03-2021.crt;"
replacemant = "server"
re.sub(r"(.*\/)([^\/]*)(\..*)", r"" + replacemant + r"", crt_line)
>>>'    ssl_certificate     /Eya/server_cert/server.crt;'

(.*\/) - 第一个组匹配所有内容直到最后一个“/”

([^\/]*) - 第二组你想替换的东西你可以跳过 为此创建一个组,因为在新版本中你真的不需要它

(\..*) - 第三组“.” + id 之后的所有内容因此您不必为不同的扩展使用不同的版本。