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