如果模式匹配,则将行插入/删除行到文件

时间:2019-01-08 15:00:53

标签: ruby

[这是一个红宝石问题]

  • 如果存在行匹配模式=>在预定义变量(行)之后插入RIGHT
  • 如果存在行匹配模式并且包含该预定义变量的行=>删除该行

给出文件: 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

2 个答案:

答案 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