Jinja2模板中的子串

时间:2017-01-22 12:46:03

标签: substring ansible jinja2

使用ansible进行部署时,我需要删除一个尾随def foo(obj: Sized): pass foo([1, 2, 3, 4]) # ok foo([2, 3, 4, 5]) # ok 子字符串的字符串。

仅当-p在最后时,字符串somemachine-prod-p才会变为somemachine-prod

我看到我可以和Jinja一起使用的子串函数不能满足我的需要,因为我需要去除字符串的结尾,而不是开头。

想法?

4 个答案:

答案 0 :(得分:36)

找到它。

如果有人想知道:

{% if name.endswith('-p') %}
{{ name[:-2] }}
{% else %}
{{ name }}
{% endif %}

答案 1 :(得分:20)

有一个更好的“oneliner”:{{ name | regex_replace('-p$','') }}

答案 2 :(得分:5)

对于简单的子字符串...

"{{var_name[start:end]}}"

其中开始是开始位置(偏移量0),结束是结束位置(偏移量1)...似乎!

此问题的标题表明,仅想从变量中获取子字符串。而且大多数其他搜索结果都具有相似的标题,但会给出特定的响应,例如拆分路径等。这是针对像我一样难以找到这样基本内容的人。

答案 3 :(得分:0)

来自文档 你可以把它包装成条件

truncate(s, length=255, killwords=False, end='...', leeway=None)

返回字符串的截断副本。长度由第一个参数指定,默认为 255。如果第二个参数为真,过滤器将按长度剪切文本。否则它将丢弃最后一个字。如果文本实际上被截断,它将附加一个省略号(“...”)。如果你想要一个不同于“...”的省略号,你可以使用第三个参数来指定它。长度仅超出第四个参数中给出的容差范围的字符串将不会被截断。

{{ "foo bar baz qux"|truncate(9) }}

-> "foo..."

{{ "foo bar baz qux"|truncate(9, True) }}

-> "foo ba..."

{{ "foo bar baz qux"|truncate(11) }}

-> "foo bar baz qux"

{{ "foo bar baz qux"|truncate(11, False, '...', 0) }}

-> "foo bar..."

较新 Jinja 版本的默认余量是 5,之前是 0,但可以全局重新配置。