在 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.crt
和 server.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 之后的所有内容因此您不必为不同的扩展使用不同的版本。
我有一个 .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.crt
和 server.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 之后的所有内容因此您不必为不同的扩展使用不同的版本。