Ansible regex_替换筛选器不工作

Ansible regex_替换筛选器不工作,regex,ansible,Regex,Ansible,我尝试使用Ansible regex_replace从状态消息中过滤子字符串“application_1514971620021_4505”。 在shell中,消息如下所示: 我在Ansible中运行此代码: --- - hosts: [npif] remote_user: root tasks: - block: - name: Admin submit check command: chdir=/usr/spring-xd-1.3.1.RELE

我尝试使用Ansible regex_replace从状态消息中过滤子字符串“application_1514971620021_4505”。 在shell中,消息如下所示:

我在Ansible中运行此代码:

---
- hosts: [npif]
  remote_user: root
  tasks:
    - block:

      - name: Admin submit check
        command: chdir=/usr/spring-xd-1.3.1.RELEASE-yarn/ bin/xd-yarn submitted
        register: admininfo

      - debug: msg="{{ admininfo.stdout }}"

      - debug: msg="{{ admininfo.stdout | regex_replace('^.*(application\_\d.*\_\d*)\s.*', '\\1') }}"

      become: yes
      become_user: ingestdev
debug:msg=“{admininfo.stdout}}”以与shell不同的格式返回状态消息:

ok: [npif] => {
    "msg": "  APPLICATION ID                  USER       NAME       QUEUE     TYPE  STARTTIME       FINISHTIME  STATE    FINALSTATUS  ORIGINAL TRACKING URL\n  ------------------------------  ---------  ---------  --------  ----  --------------  ----------  -------  -----------  ------------------------\n  application_1514971620021_4505  ingestdev  spring-xd  batch_cb  XD    1/3/18 2:49 PM  N/A         RUNNING  UNDEFINED    http://x.x.x.x:9394"
}
当我使用regex_replace运行第二个调试时,我得到与第一个调试输出相同的输出-没有应用regex_replace过滤器。正则表达式过滤器是正确的-我已经对它进行了外部测试。基本上,Ansible代码也在工作——我已经用下面的行进行了测试,并按预期得到了“测试”

- debug: msg="{{ 'test.home.com' | regex_replace('^([^.]*).*', '\\1') }}"

你知道我的方法有什么问题吗

您的第一个问题是,
*
似乎与换行符不匹配。考虑这一点:

- debug:                                                                    
    msg: "{{ admininfo.stdout | regex_replace('.*application', 'foo') }}"  
这将用
foo
替换
application
,但标题行将保持不变。由于
^
将正则表达式锚定到文本的开头(而不是行首),因此表达式将永远不匹配

您可以利用ansible已经在注册输出的
stdout\u line
键中为您提供了单独的行这一事实。在本例中,您将使用以下内容:

- debug:
    msg: >
      {{ admininfo.stdout_lines[2] | regex_replace('^.*(application_\d.*_\d*)\s.*', '\1') }}
请注意,我对引用和转义的方式做了一些更改。特别是,我使用折叠文字运算符
代替双引号,您需要使用
\1
代替替换字符串的
\\1

这给了我:

ok: [localhost] => {
    "msg": "application_1514971620021_4505\n"
}

第一个问题是,
*
似乎与换行符不匹配。考虑这一点:

- debug:                                                                    
    msg: "{{ admininfo.stdout | regex_replace('.*application', 'foo') }}"  
这将用
foo
替换
application
,但标题行将保持不变。由于
^
将正则表达式锚定到文本的开头(而不是行首),因此表达式将永远不匹配

您可以利用ansible已经在注册输出的
stdout\u line
键中为您提供了单独的行这一事实。在本例中,您将使用以下内容:

- debug:
    msg: >
      {{ admininfo.stdout_lines[2] | regex_replace('^.*(application_\d.*_\d*)\s.*', '\1') }}
请注意,我对引用和转义的方式做了一些更改。特别是,我使用折叠文字运算符
代替双引号,您需要使用
\1
代替替换字符串的
\\1

这给了我:

ok: [localhost] => {
    "msg": "application_1514971620021_4505\n"
}

这个
^([^.]*).
作用于哪个字符串?如果没有
,它将删除该行。如果总是有一个
,最好使用这个
\..*
替换为nothing。您提到的字符串仅用于测试-要知道,regex\u替换工作正常。主代码中正则表达式的问题:regex_replace('^.*(application_d.*.\ud*))\s、 *'-这是正确的,但不适用于AnsibleWhat's the确切的问题是什么?这在问题中有很好的描述。请不要发布文本图片。只发布文本本身。这使得阅读更容易,搜索更容易,如果有人想在编写答案时测试问题,复制和粘贴更容易。字符串是什么
^([^.]*).
是否在作用?如果没有
,它将删除该行。如果总是有
,最好使用此
\..*
替换为空。您提到的字符串仅用于测试-要看,该regex\u替换有效。我对主代码中regex表达式的问题:regex\u replace(“^.*(应用程序.\ud..\ud*)\s、 *'-这是正确的,但不适用于AnsibleWhat's the确切的问题是什么?这在问题中有很好的描述。请不要发布文本图片。只发布文本本身。这使阅读更容易,搜索更容易,如果有人想在编写答案时测试,复制和粘贴更容易。谢谢!这是我的这是正确的答案。我按照你的建议编辑了我的代码,它很有效!!!:-debug:msg=“{{admininfo.stdout_-lines[2]| regex_-replace('^..*(application\d.*.\s.*,'\1')}”谢谢!这是正确的答案。我按照你的建议编辑了我的代码,它很有效!!!:-debug:msg=“{{admininfo.stdout_-lines[2]| regex|replace('^)*(应用程序\ud.*\ud*)\s.'','\1')}”