将 Chef insert_line_if_no_match 与“\:”一起使用

use Chef insert_line_if_no_match with "\:"

我该如何更改我的正则表达式,以便每次调用代码时都不会将该行重写到文件中?

line_text = 'Everything is ok\:ok check /test/user/*'
ruby_block "update file" do
  block do
    fe = Chef::Util::FileEdit.new("/home/user/test")
    fe.insert_line_if_no_match(/#{line_text}/, line_text)
    fe.write_file
  end
end

我认为“\:”是每次重写该行的问题。

反斜杠字符在正则表达式中是“特殊”字符,因为它转义了后面的字符,因此下一个字符将被视为普通字符。末尾的星号也比较特殊,表示前一个字符出现0次或多次

您在没有处理这些情况的情况下在那里构建您的正则表达式。在此之后,原始字符串中的反斜杠字符被正则表达式匹配忽略,星号字符可能会导致稍微不正确的匹配(同样不考虑源字符串中的文字星号)。

要解决此问题,您可以在构建正则表达式时转义 line_text 变量,方法是使用 Regexp.escape:

line_text = 'Everything is ok\:ok check /test/user/*'
ruby_block "update file" do
  block do
    fe = Chef::Util::FileEdit.new("/home/user/test")
    fe.insert_line_if_no_match(/#{Regexp.escape(line_text)}/, line_text)
    fe.write_file
  end
end