Python - сопоставить слово, но не слово с другим словом рядом с ним - PullRequest
0 голосов
/ 02 июня 2019

Я пытаюсь заменить значения в файле /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. Итак,сначала проходит «base» и заменяет все строки, начинающиеся с «base», на «base dc = company, dc = org», и больше нет элемента «base group» для замены.

Как я могу сказать, что это не соответствует 'base' в 'base group'?Это не единственные элементы, которые я заменяю, поэтому я стараюсь сделать их как можно более общими.Спасибо.

1 Ответ

0 голосов
/ 02 июня 2019

Вам лучше получить ключ конфигурации из строки конфигурации и выяснить, соответствует ли он конфигурации, которую необходимо переопределить, вместо того, чтобы иметь уровень с несколькими циклами. Следующий код использует регулярное выражение для извлечения ключа конфигурации с помощью селектора группы захвата.

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...