替换文件中的匹配行但忽略使用Ruby的注释掉的行

时间:2017-09-11 14:23:41

标签: ruby regex

如何在Ruby中替换文件,但不要触及注释掉的行?更具体地说,我想在配置文件中更改变量。一个例子是:

irb(main):014:0> string = "#replaceme\n\t\s\t\s# replaceme\nreplaceme\n"
=> "#replaceme\n\t \t # replaceme\nreplaceme\n"
irb(main):015:0> puts string.gsub(%r{replaceme}, 'replaced')
#replaced
                 # replaced
replaced
=> nil
irb(main):016:0>

期望的输出:

#replaceme
                 # replaceme
replaced

2 个答案:

答案 0 :(得分:1)

我不完全理解这个问题。要在每一行中查找和替换,忽略英镑符号后面的文本,可以执行以下操作。

def replace_em(str, source, replacement)
  str.split(/(\#.*?$)/).
      map { |s| s[0] == '#' ? s : s.gsub(source, replacement) }.
      join
end

str = "It was known that # that dog has fleas, \nbut who'd know that that dog # wouldn't?"
replace_em(str, "that", "the")
  #=> "It was known the # that dog has fleas, \nbut who'd know the the dog # wouldn't?"

str = "#replaceme\n\t\s\t\s# replaceme\nreplaceme\n"
replace_em(str, "replaceme", "replaced")
  #=> "#replaceme\n\t \t # replaceme\nreplaced\n"

对于字符串

str = "It was known that # that dog has fleas, \nbut who'd know that that dog # wouldn't?"
source = "that"
replacement = "the"

步骤如下。

a = str.split(/(\#.*?$)/)
  #=> ["It was known that ", "# that dog has fleas, ",
  #    "\nbut who'd know that that dog ", "# wouldn't?"]

请注意,必须将正则表达式的主体放在捕获组中,以便将用于拆分字符串的文本作为元素包含在结果数组中。请参阅String#split

b = a.map { |s| s[0] == '#' ? s : s.gsub(source, replacement) }
  #=> ["It was known the ", "# that dog has fleas, ",
  #    "\nbut who'd know the the dog ", "# wouldn't?"]
b.join
  #=> "It was known the # that dog has fleas, \nbut who'd know the the dog # wouldn't?"

答案 1 :(得分:0)

这个怎么样?

puts string.gsub(%r{^replaceme}, 'replaced')