Thank you for your replies. The search test does work with lists and this 
is where the
issue lies. Your examples helped me clear this up. The search, regex, etc 
tests will 
convert the object to a string. In python code, this means that the list 
will be turned
into a string with str(list_here). This will escape tab characters in the 
list items, so 
that a list ["a", "b\t"] will get converted to the string, '["a", "b\\t"]'. 
To match this correctly
with the search test, I need to search for ...b\\t... in single quotes.
On Monday, June 20, 2022 at 9:22:37 PM UTC+2 [email protected] wrote:

> On Mon, 20 Jun 2022 02:36:37 -0700 (PDT)
> "[email protected]" <[email protected]> wrote:
>
> > q:
> > - 'abc<tab character here>'
> > - 123
> >
> > - debug:
> > msg: >-
> > {{ q is search('abc\t') }}
>
> There are more aspects to this question:
>
> * It's necessary to understand the difference between 'Double-Quoted
> Style' and 'Single-Quoted Style'. See
> https://yaml.org/spec/1.2.2/#731-double-quoted-style
> https://yaml.org/spec/1.2.2/#732-single-quoted-style
>
> In 'Single-Quoted Style' only "'" has to be escaped. As a result, the
> string 'abc\t' doesn't include TAB. It's a sequence of characters: a,
> b, c, \, t. Test it. The task below
>
> - copy:
> dest: /tmp/test.txt
> content: |
> {{ ql.0 }}
> {{ ql.1 }}
> vars:
> ql:
> - 'abc\tx'
> - 123
>
> gives
>
> shell> cat /tmp/test.txt
> abc\tx
> 123
>
> The string will include TAB if you use 'Double-Quoted Style'
>
> - copy:
> dest: /tmp/test.txt
> content: |
> {{ ql.0 }}
> {{ ql.1 }}
> vars:
> ql:
> - "abc\tx"
> - 123
>
> gives
>
> shell> cat /tmp/test.txt
> abc x
> 123
>
> * The *search* test doesn't work with lists. It works with strings.
> See
>
> https://docs.ansible.com/ansible/latest/user_guide/playbooks_tests.html#testing-strings
>
> Use it to test a single item of a list. For example,
>
> - debug:
> msg: "{{ ql.0 is search(regex) }}"
> vars:
> regex: 'abc\tx'
> ql:
> - "abc\tx"
> - 123
>
> gives
>
> msg: true
>
> Also the task below, with single-quoted *item* and escaped backslash
> in *regex*, gives the same result
>
> - debug:
> msg: "{{ ql.0 is search(regex) }}"
> vars:
> regex: 'abc\\tx'
> ql:
> - 'abc\tx'
> - 123
>
> * Instead, you can "Test if a list contains a value". See
>
> https://docs.ansible.com/ansible/latest/user_guide/playbooks_tests.html#testing-if-a-list-contains-a-value
>
> For example, both tasks below returns *True*
>
> - debug:
> msg: "{{ item in ql }}"
> vars:
> item: 'abc\tx'
> ql:
> - 'abc\tx'
> - 123
>
> - debug:
> msg: "{{ item in ql }}"
> vars:
> item: "abc\tx"
> ql:
> - "abc\tx"
> - 123
>
> * If you want to use *regex* to test an item in a list use *select*.
> For example,
>
> - debug:
> msg: "{{ ql|select('search', regex) }}"
> vars:
> regex: 'abc\\tx'
> ql:
> - 'abc\tx'
> - 123
>
> gives
>
> msg:
> - abc\tx
>
> , or use it in a condition. For example,
>
> - debug:
> msg: "Regex {{ regex }} is present in the list."
> when: ql|select('search', regex)|length > 0
> vars:
> regex: 'abc\\tx'
> ql:
> - 'abc\tx'
> - 123
>
> gives
>
> msg: Regex abc\\tx is present in the list.
>
> -- 
> Vladimir Botka
>

-- 
You received this message because you are subscribed to the Google Groups 
"Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/ansible-project/d9c435fd-180b-4f1d-aed7-57c1deb6fc8dn%40googlegroups.com.

Reply via email to