【问题标题】:use Chef insert_line_if_no_match with "\:"将 Chef insert_line_if_no_match 与“\:”一起使用
【发布时间】:2020-10-29 00:05:44
【问题描述】:

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

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

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

【问题讨论】:

    标签: regex ruby chef-infra


    【解决方案1】:

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

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

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

    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
    

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 1970-01-01
      • 2013-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-08
      相关资源
      最近更新 更多