Regex 无法使用Ansible正则表达式从文件中删除条目

Regex 无法使用Ansible正则表达式从文件中删除条目,regex,grep,ansible,regex-negation,regex-group,Regex,Grep,Ansible,Regex Negation,Regex Group,注:我正在寻找Ansible的解决方案。以下是问题说明: 我有一个文件filedet.yml,如下所示,但实时此yaml可能包含更多IP和文件详细信息 --- 10.9.9.111: /tmp/test.jar: hash: e6df90d38fa86f0e289f73d79cd2cfd2a29954eb /tmp/best.jar: hash: e6df90d38fa86f0e289f73d79cd2cfd2a29954eb 10.8.8.44: /tmp/co

注:我正在寻找Ansible的解决方案。以下是问题说明:

我有一个文件filedet.yml,如下所示,但实时此yaml可能包含更多IP和文件详细信息

---
10.9.9.111:
  /tmp/test.jar:
    hash: e6df90d38fa86f0e289f73d79cd2cfd2a29954eb

  /tmp/best.jar:
    hash: e6df90d38fa86f0e289f73d79cd2cfd2a29954eb

10.8.8.44:
  /tmp/conf/extra/httpd-ssl.conf:
    hash: 1746f03d57491b27158b0d3a48fca8b5fa85c0c2

  /tmp/conf/httpd.conf:
    hash: 1746f03d57491b27158b0d3a48fca8b5fa85c0c2
我希望提取特定的IP和文件详细信息,以便使用
state:缺席
属性将其从yaml中删除。因此,所需的正则表达式应返回以下值:

10.9.9.111:
  /tmp/test.jar:
    hash: e6df90d38fa86f0e289f73d79cd2cfd2a29954e

  /tmp/best.jar:
    hash: e6df90d38fa86f0e289f73d79cd2cfd2a29954eb
我决定将开始模式设置为“10.9.9.111”,搜索直到没有空格或换行符,这意味着直到它到达下一个IP

我准备了下面的正则表达式,它在上显示了正确的、所需的全文匹配。请参阅快照

正则表达式查询如下:

[^#](^10.9.9.111:)(.|\n)*^(?!( |\n))

同样的正则表达式可以很好地处理
grep-Pzo
并返回所需的字符串。但是,正则表达式无法使用ansible的
lineinfle
模块,因为它不会生成任何结果

我希望这个正则表达式或任何其他解决方案与Ansible一起工作,这样我就可以从yaml中删除给定的IP及其文件详细信息

Ansible:

   - name: "Remove entry from file."
     lineinfile:
       path: "/app/filedet.yaml"
       regexp: "[^#](^10.9.9.111:)(.|\n)*^(?!( |\n))"
       state: absent
你能告诉我这里有什么问题吗

问:“我希望提取IP和文件详细信息。”

A:使用。比如说

    - include_vars:
        file: filedet.yml
        name: my_dict
    - debug:
        msg: "{{ my_dict['10.9.9.111'] }}"
$ cat filedet.yml.j2
{% for item in my_dict_keys %}
{{ item }}:
  {{ my_dict[item]|to_nice_yaml|indent(2) }}
{% endfor %}
给予


Q:“从文件中删除条目。”

A:使用模板。比如说

    - include_vars:
        file: filedet.yml
        name: my_dict
    - debug:
        msg: "{{ my_dict['10.9.9.111'] }}"
$ cat filedet.yml.j2
{% for item in my_dict_keys %}
{{ item }}:
  {{ my_dict[item]|to_nice_yaml|indent(2) }}
{% endfor %}
下面的任务

    - set_fact:
        my_dict_keys:
          - "10.8.8.44"
    - template:
        src: filedet.yml.j2
        dest: filedet.yml
给予


注:

  • 为此目的使用
    lineinfle
    是个坏主意

  • 问题中的数据不是有效的YAML。关键是重复


在POSIX*RES中,正则表达式中间的回旋匹配一个规则的回旋;它失去了作为一个特殊角色的意义。IIRC a POSIX grep不能执行多行匹配
grep
一次只检查一行;没有办法用这个工具来指定应该跨越换行符的匹配项。这能回答你的问题吗?我不是在寻找grep的解决方案,而是在寻找一个能与Ansible
grep-Pzo一起工作的正则表达式。但是我怎样才能让它与Ansible的Lineinfle一起工作呢?你能让模板包含所有ip和文件详细信息吗?除了我想在本例中删除的10.9.9.111No之外。我不能。模板是很好的,因为它是。相反,你可以先测试你想要什么,然后用所有相关的细节更新你的问题。你能看一看吗?这里有一篇新的文章,描述精妙:
10.9.9.111:
  /tmp/test.jar:
    hash: e6df90d38fa86f0e289f73d79cd2cfd2a29954eb
  /tmp/test.jar:
    hash: e6df90d38fa86f0e289f73d79cd2cfd2a29954eb