我正在尝试将/etc/nslcd.conf文件中的值替换为参数文件中的值。有两个参数使我非常痛心。
base dc=example,dc=com
base group ou=groups,dc=example,dc=com
参数文件具有这两个变量的值
base = dc=company,dc=org
base group = ou=admingroups,dc=company,dc=org
在将每个参数存储在像这样的字典中之后,我要遍历每个参数
for key in sorted(d):
item = key
print("Processing Key:", item)
with open ('/etc/nslcd.conf', 'r') as fr:
with open ('/tmp/nslcd_tmp', 'w+') as fw:
# Iterate through lines in nslcd.conf file
for line in fr:
# Some options are commented and some are not
itemy = '#' + item
if line.startswith(item) or line.startswith(itemy):
print('Replaced value for:', item)
fw.write(item + '' + d[item])
elif item == 'base group':
fw.write(item + '' + d[item])
else:
fw.write(line)
我遇到的问题是...
1.由于文件中多次提到诸如uri之类的键,因此我必须循环浏览所有行并替换所有行。
2.因此,第一个“基础”将遍历,并将以“基础”开头的所有行替换为“基础dc = company,dc = org”,并且不再需要替换“基础组”项。
我如何告诉它与“基本组”中的“基本”不匹配?这些不是我要替换的唯一项目,因此我将其尽可能保持通用。谢谢。
答案 0 :(得分:0)
最好从配置行获取配置密钥,然后查找它是否与需要覆盖而不是具有多个循环级别的配置相匹配。以下代码使用正则表达式通过捕获组选择器提取配置密钥。
import re
regex = '^#?\s*(\w+\s*\w*)\s\w*='
d = {
"base": "dc=company,dc=org",
"base group": "ou=admingroups,dc=company,dc=org"
}
with open ('nslcd.conf', 'r') as fr:
with open ('result.conf', 'w+') as fw:
for line in fr:
line = line.strip()
match = re.search(regex, line)
if match and match.group(1) and match.group(1) in d:
key = match.group(1)
fw.write(('', '# ')[line.startswith('#')] + key + ' ' + d[key] + '\n')
else:
fw.write(line)