【问题标题】: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