【发布时间】:2017-06-07 01:26:28
【问题描述】:
使用 ansible 进行部署时,有 1 种特定情况我需要去除尾随 -p 子字符串的字符串。
仅当-p 位于末尾时,字符串somemachine-prod-p 才应变为somemachine-prod。
我看到的可以与 Jinja 一起使用的子字符串函数不能满足我的需求,因为我需要去除字符串的结尾,而不是开头。
想法?
【问题讨论】:
使用 ansible 进行部署时,有 1 种特定情况我需要去除尾随 -p 子字符串的字符串。
仅当-p 位于末尾时,字符串somemachine-prod-p 才应变为somemachine-prod。
我看到的可以与 Jinja 一起使用的子字符串函数不能满足我的需求,因为我需要去除字符串的结尾,而不是开头。
想法?
【问题讨论】:
找到了。
如果有人想知道:
{% if name.endswith('-p') %}
{{ name[:-2] }}
{% else %}
{{ name }}
{% endif %}
【讨论】:
对于简单的子字符串...
"{{var_name[start:end]}}"
start 是起始位置(偏移量 0),end 是结束位置(偏移量 1)......看起来!
这个问题的标题表明只想从变量中获取子字符串。大多数其他搜索结果都有类似的标题,但会给出特定的响应,例如拆分路径等。这适用于像我一样难以找到此类基本内容的人。
【讨论】:
有一个更好的“oneliner”:{{ name | regex_replace('-p$','') }}。
【讨论】:
regex_replace 不是默认过滤器。 ansible 中就是这种情况,它提供了extra filters。如果你愿意,你也可以省略最后一个参数:{{ name | regex_replace('-p$')。
来自文档 你可以把它包起来
截断(s, length=255, killwords=False, end='...', leeway=None)
返回字符串的截断副本。长度由第一个参数指定,默认为 255。如果第二个参数为 true,过滤器将按长度剪切文本。否则它将丢弃最后一个单词。如果文本实际上被截断,它将附加一个省略号(“...”)。如果您想要一个不同于“...”的省略号,您可以使用第三个参数指定它。仅超出第四个参数中给出的容差范围的长度的字符串将不会被截断。
{{ "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,但可以全局重新配置。
【讨论】: