我尝试使用正则表达式替换过滤器,以便从开始到最后一个正斜杠提取所有字符串
来自Linux的sed正在运行:echo /a/b/c.log | sed 's/\(.*\)\/.*/\1/'
output: /a/b
但使用ansible:
"{{log_path | regex_replace('s/\(.*\)\/.*/\', '1/')}}"
备注:log_path是一个var,其日志完整路径如/a/b/c.log
我收到的错误如下:
异常:解析带引号的标量
找到了未知的逃脱角色
我知道我可以做那样的事情:" {{log_path.split(' /')[0:-1] |加入(' /')}}"
但我更喜欢正则表达式
知道我做错了什么?
答案 0 :(得分:1)
不要将sed
语法(s/pattern/replacement/
)用于ansible。只需将正则表达式放入字符串即可。您也不需要转义()括号。我认为你也不需要逃避斜线。实际上,Python / ansible的PCRE与它们的前辈有很大不同。我是sed的爱好者,但是我建议你用Python开发你的正则表达式,而不是sed。
实际上,你的问题不是其中任何一个,尽管它们会使模式错误。您的问题是您正在逃避结束单一报价。很难看到,所有这些反斜杠。
这应该让你开始朝着正确的方向前进:
"{{log_path | regex_replace('(.*)/.*/', '\1')}}"
http://docs.ansible.com/ansible/latest/replace_module.html有更多的例子。