You said, "However the split happens based on ',' , and then we remove the quotes with  map('map', 'trim')) and align the lines with range."

It's true that "split(',')" will split a string containing commas into a list of strings. But the trim filter does nothing with quotes.

Rather, "trim" removes leading and trailing spaces from the string piped into it:
  a_string | trim

Further, "map('trim')" removes leading and trailing spaces from each string of the list of strings passed to it:
  [str0, str1, str2] | map('trim')

Finally, "map('map', 'trim')" trims strings two levels deep in lists:
  [[sa0, sa1], [sb0, bs1], [sc0, sc1]] | map('map', 'trim')

Quotes never play into it. In fact, in what you initially posted, and in my response, the string data contain no quotes.

Also, "range" isn't to align anything. It provides the necessary first parameter to the "extract" filter.
However assuming split with delimiter as comma,  when i try to replace 1 with 0  the output is [msg: "{{ range(my_var | length) | map('extract', (my_var | map('split', ',') | map('map', 'trim')), [*0*]) }}"]
Yes, you changed the "1" to a "0", so you get the first (index=0) item in the list produced by the split.

When it was "1", you got the second item (index=1) in each list produced by the split, that is "color-red", "color-blue", and "color-orange". From your initial post, that's what I thought you wanted.

If what you really want is this:
    new_var:
    - line1 has color-red
    - line2 has color-blue
    - line3 has color-orange
then you can use this instead:

    - name: First and Second parts from split on comma
      ansible.builtin.set_fact:
        new_var: "{{ my_var | map('regex_replace', '^([^,]*),([^,]*),.*', '\\1 \\2') 
| map('regex_replace', ' +', ' ') }}"



On 12/15/23 12:15 PM, Veera wrote:
Hi Todd Lewis,

Thanks . I am able to understand it . However the split happens based on ',' , and then we remove the quotes with  map('map', 'trim')) and align the lines with range. However assuming split with delimiter as comma,  when i try to replace 1 with 0  the output is [msg: "{{ range(my_var | length) | map('extract', (my_var | map('split', ',') | map('map', 'trim')), [0]) }}"]
ok: [localhost] =>
  msg:
  - line1 has
  - line2 has
  - line3 has

and when tried to add [0 1] in the end [msg: "{{ range(my_var | length) | map('extract', (my_var | map('split', ',') | map('map', 'trim')), [0 1]) }}"]
it printsok: [localhost] =>
  msg:
  - i
  - i
  - i
that is second character in the word line[0]. Is not the split breaks the words  with (',')? How to print all the available column? instead of 1( yes the full  file without a comma now )
Actually I am trying to print like below

line1 has  color-red
line2 has  color-blue
line3 has  color-orange

On Friday, December 15, 2023 at 10:42:43 PM UTC+5:30 Veera wrote:

    Hi Todd Lewis,

    Thanks . I am able to understand it . However the split happens
    based on ',' , and then we remove the quotes with map('map',
    'trim')) and align the lines with range.
    However assuming split with delimiter as comma,  when i try to
    replace 1 with 0  the output is  [msg: "{{ range(my_var | length)
    | map('extract', (my_var | map('split', ',') | map('map',
    'trim')), [1]) }}"]
    ok: [localhost] =>
      msg:
      - line1 has
      - line2 has
      - line3 has

    and when tried to add [0 1] in the  end  [msg: "{{ range(my_var |
    length) | map('extract', (my_var | map('split', ',') | map('map',
    'trim')), [0 1]) }}"]
    it printsok: [localhost] =>
      msg:
      - i
      - i
      - i
    that is second character in the word line[0]. Is not the split
    breaks the words  with (',')?
    How to print all the available column? instead of 1( yes the full 
    file without a comma now )
    Actually I am trying to print like below
     line1 has  color-red
    line2 has color-blue
    line3 has, color-orange



    On Friday, December 15, 2023 at 2:44:45 AM UTC+5:30 Todd Lewis wrote:

        In the code below, note that "range(my_var | length)" is
        equivalent to "[0, 1, 2]".

        In the set_fact, we don't "loop" the task; rather we loop over
        the data within the jinja2 expression by using the map filter.

        utoddl@tango:~/ansible*$ cat veera01.yml*
        ---
        # veera01.yml
        - name: Jinja expressions
           hosts: localhost
           gather_facts: false
           vars:
             my_var:
               - "line1 has , color-red, in  its   middle"
               - "line2 has,   color-blue,   in its middle"
               - "line3 has,  color-orange, in its middle"
           tasks:
             - name: Split and trim parts from my_var
               ansible.builtin.debug:
                 msg: "{{ my_var | map('split', ',') | map('map', 'trim') }}"

             - name: Extract the "color-*" parts from my_var
               ansible.builtin.debug:
                 msg: "{{ range(my_var | length) | map('extract', (my_var | 
map('split', ',') | map('map', 'trim')), [1]) }}"

             - name: Same but as set_fact
               ansible.builtin.set_fact:
                 new_var: "{{ range(my_var | length) | map('extract', (my_var | 
map('split', ',') | map('map', 'trim')), [1]) }}"


        utoddl@tango:~/ansible*$ ansible-playbook veera01.yml -v*
        Using /etc/ansible/ansible.cfg as config file

        PLAY [Jinja expressions] **********************************************

        TASK [Split and trim parts from my_var] *******************************
        ok: [localhost] =>
           msg:
           - - line1 has
             - color-red
             - in  its   middle
           - - line2 has
             - color-blue
             - in its middle
           - - line3 has
             - color-orange
             - in its middle

        TASK [Extract the "color-*" parts from my_var] ************************
        ok: [localhost] =>
           msg:
           - color-red
           - color-blue
           - color-orange

        TASK [Same but as set_fact] *******************************************
        ok: [localhost] => changed=false
           ansible_facts:
             new_var:
             - color-red
             - color-blue
             - color-orange

        PLAY RECAP ************************************************************
        localhost                  : ok=3    changed=0    unreachable=0    
failed=0    skipped=0    rescued=0    ignored=0


        On 12/14/23 5:50 AM, Veera wrote:
        I have a playbook variable output as below


        debug:
          msg: "{{my_var}}}"

        TASK [debug]
        
**************************************************************************************************************************
        ok: [localhost] => {
            "msg": [
                "line1 has , color-red, in  its   middle"
                "line2 has,   color-blue,   in its middle"
                "line3 has,  color-orange, in its middle"
            ]
        }

        I want to use the output lines as  an input for another
        variable using set_fact , as like below .

          - name: Filtering  the color data
            ansible.builtin.set_fact:
              new_var: "{{ item.split(',')[1] }}"
        loop: "{{ var1 }}"

        and I am looking for the data like below
          color-red
          color-blue
          color-orange

         - debug:
             var:  new_var
        gives only color-red

         But my  var1 looping process the first line only in from the
        my_var and not the next 2 lines.
         This is an example and I may expect lines from my_var from 0
        to 100's.

        How to print the column[]of output) with multiple lines ??

-- 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/3490a8af-689c-4cb1-8670-1495258df226n%40googlegroups.com
        
<https://groups.google.com/d/msgid/ansible-project/3490a8af-689c-4cb1-8670-1495258df226n%40googlegroups.com?utm_medium=email&utm_source=footer>.

-- Todd

--
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/6ec4afb2-6c70-4bc0-a1a0-2205ed7d49c0n%40googlegroups.com <https://groups.google.com/d/msgid/ansible-project/6ec4afb2-6c70-4bc0-a1a0-2205ed7d49c0n%40googlegroups.com?utm_medium=email&utm_source=footer>.

--
Todd

--
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/161f6243-05a0-41cd-a78d-4527bb08a86f%40gmail.com.

Reply via email to