Я не совсем слежу за тем, что вы собираетесь или что идет не так в настоящее время, но вот некоторые вещи, которые могут быть вашей проблемой:
В регулярном выражении 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)