[这是一个红宝石问题]
给出文件: 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
现在:
如果我第一次遇到脚本,则此输出=>
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
由于我的红宝石技能很低,因此非常希望有更好的示例/解释。
P.S。
预期结果:
...并且如果我第二次失败,则应该获得此输出=>
line1
line2
line3
line4
ldap_filters = yes
line..M
line..N
答案 0 :(得分:0)
我不完全了解您的要求或当前出了什么问题,但这是可能可能是您的问题的一些事情:
在ruby正则表达式中,^和$匹配字符串的开头/结尾,而不是行的结尾。您可能想改用\ A和\ Z来匹配行尾。
您正在混合使用面向行的处理和文件级的处理。也许行得通吗?但是令人困惑。我会坚持一个或另一个。我认为,您根本不需要遍历所有行。您可以测试:
f.match(/\Aldap_filter_users\Z/)
此外,“ f”看起来像文件句柄。尝试使用“ conf”或其他方法。 (样式)
您是否要在输出中仅包含“#”的行?如果没有,请更改此行:
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)
答案 1 :(得分:0)
我认为您的代码的关键问题是它确实 全局替换并在遍历所有行时写入输出。
这应该产生想要的输出
linear, parable, sine is/are the function(s) with the highest value: 0