Вставить / удалить строку в файл, если шаблон соответствует - PullRequest
0 голосов
/ 08 января 2019

[это проблема с рубином]

  • если существует шаблон соответствия строки => вставить ПРАВО после предварительно определенной переменной (строки)
  • если существует шаблон соответствия строк И также строка, содержащая эту предопределенную переменную => удалить эту строку

Данный файл: ldap_config.conf

line1
line2
line3
line4
ldap_filters = yes
line..M
line..N

test_add_del.rb

users = %w/user1 user2 user3/
users.length == 1 ? _var = “(#{users[0]})” : _var = ‘(|’ + users.map{|u| “(#{u})”}.join + ‘)’
f = File.open(“ldap_config.conf”).read

f.each_line do |line|
    if  line.match(/ldap_filter_users/)
            f.gsub!(/\sldap_filter_users\s+=.*$/, '#')
            File.write("ldap_config.conf", f)
    elsif line.match(/ldap_filters =/)
            f.gsub!(/ldap_filters = yes/, "ldap_filters = yes\n ldap_filter_users = "+_var)
            File.write("ldap_config.conf", f)

    end
end

ТЕПЕРЬ:

если я запускаю 1 раз скрипт получит этот вывод =>

line1
line2
line3
line4
ldap_filters = yes
ldap_filter_users = (|(user1)(user2)(user3))
line..M
line..N

… и если я прогоню его во второй раз, получу этот вывод =>

line1
line2
line3
line4
ldap_filters = yes
#
#
line..M
line..N

Поскольку мои рубиновые навыки довольно низкие, лучший пример / объяснение было бы очень полезно.

приписка

ожидаемый результат:

… и если я прогоню его во второй раз, то получу этот вывод =>

line1
line2
line3
line4
ldap_filters = yes
line..M
line..N

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Я думаю, что основная проблема с вашим кодом заключается в том, что он global заменяет и записывает вывод, пока он перебирает все строки.

Это должно дать желаемый результат

users = %w/user1 user2 user3/
_var = users.map { |u| "(#{u})" }.join
_var = "(|#{_var})" if users.length > 1
f = File.open("ldap_config.conf").read

changed = 
  if f.match(/ldap_filter_users/)
    f.gsub!(/ldap_filter_users\s+=.*$\n/, '') 
  elsif f.match(/ldap_filters =/)
    f.gsub!(/ldap_filters = yes/, "ldap_filters = yes\nldap_filter_users = #{_var}")
  end

File.write("ldap_config.conf", f) if changed
0 голосов
/ 08 января 2019

Я не совсем слежу за тем, что вы собираетесь или что идет не так в настоящее время, но вот некоторые вещи, которые могут быть вашей проблемой:

В регулярном выражении ruby ​​^ и $ соответствуют началу / концу строки, а не концу строки. Вы, вероятно, хотите использовать \ A и \ Z вместо этого, чтобы соответствовать окончанию строки.

Вы делаете смесь строковой обработки и обработки на уровне файлов. Может быть, это работает? Но сбивает с толку. Я бы придерживался одного или другого. Я думаю вам вообще не нужно перебирать строки. Вы можете просто проверить на:

f.match(/\Aldap_filter_users\Z/)

Кроме того, "f" выглядит как дескриптор файла. Попробуйте "конф" или что-то вместо этого. (Стиль)

Вы хотите, чтобы строки с "#" выводились? Если нет, измените эту строку:

conf.gsub!(/\Aldap_filter_users\s+=.*\Z/, '#')  

к этому:

conf.gsub!(/\Aldap_filter_users\s+=.*\Z/, '')  

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

Нечто подобное может исправить это или, по крайней мере, упростить отслеживание проблемы.

users = %w/user1 user2 user3/

if users.length == 1 
  user_list = "(#{users[0]})"
else
  user_list = '(|' + users.map{|u| "(#{u})"}.join + ')'
end

conf = File.open("ldap_config.conf").read

if conf.match(/\Aldap_filter_users\Z/)
  conf.gsub!(/\Aldap_filter_users\s+=.*\Z/, '#')  
elsif line.match(/\Aldap_filters =/)
  conf.gsub!(/\Aldap_filters = yes\Z/, "ldap_filters = yes\n ldap_filter_users = #{user_list}")        
end

File.write("ldap_config.conf", conf)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...