拆分字符串以获取除最后一个元素之外的所有元素

问题描述 投票:0回答:4

这是我的剧本

---
- name: This is a hello-world example
  hosts: localhost
  vars:
    mystr: "I.To.Be.war"
  tasks:

    - name: Hi
      debug:
        msg: "{{ mystr.split('.') | first | trim }}"

输出:

I

trim
过滤器是为了去掉变量末尾的
\r\n
,以防它有。

但是,我希望有一个通用的解决方案,应该在分割定界符的最后一个元素之前打印所有内容,即:

.

预期输出:

I.To.Be

注意:我不想要像

"{{ mystr.split('.')[0][1][2] }}"
这样的解决方案,因为它本质上不是通用的。

split ansible formatting
4个回答
5
投票
  1. 使用
    trim
    过滤器
    map
  2. 过滤器应用于列表中的每个元素
  3. 使用 python 列表切片来获取除最后一个之外的所有内容
  4. 重新加入元素
$ ansible localhost -m debug \
-a "msg={{ (mystr.split('.') | map('trim'))[:-1] | join('.') }}" \
-e "mystr=I.to.be.war"
localhost | SUCCESS => {
    "msg": "I.to.be"
}

或者,您可以使用正则表达式来匹配字符串的第一部分

$ ansible localhost -m debug \
-a 'msg={{ mystr | regex_replace("^(.*)\\.[^.]*$", "\\1") }}' \
-e "mystr=I.to.be.war"
localhost | SUCCESS => {
    "msg": "I.to.be"
}

4
投票

由于您的要求似乎是获取不带扩展名的文件名,请注意有一个额外的 Jinja 过滤器,

splitext
,专用于此:

地点、任务

- debug:
    var: "'I.To.Be.war' | splitext | first | trim"

会给你期望的

ok: [localhost] => 
  '''I.To.Be.war'' | splitext | first | trim': I.To.Be

虽然过滤器 splitext 实际上返回一个元组,但比常规

split
更方便:

ok: [localhost] => 
  '''I.To.Be.war'' | splitext | trim': ('I.To.Be', '.war')

3
投票

您可以使用 Ansible 的

regex_replace()
过滤器:

mystr | regex_replace('\\.[^.]+$', '')

0
投票

要创建一个目录作为 Ansible 任务,而不在变量的路径中定义子文件夹:

- name: "Create folder"
  ansible.builtin.file:
    path: '{{ sample_variable_name_from_group_vars_all | regex_replace("^(.*)\\.[^.]*$", "\\1") }}'
    state: directory

请注意,此示例有一个文件夹

group_vars
,其中包含一个名为
all
的文件 以及内部的变量,例如:

---
sample_variable_name_from_group_vars_all: /var/www/mywebsite/subfolder

任务将创建目录:

/var/www/mywebsite

© www.soinside.com 2019 - 2024. All rights reserved.