I’m a complete noob when it comes to bash, I extracted some timestamps from an xml file using xmlstarlet however its formatted as a space separated string rather than an array. I need them as an array so that I can use them in a for loop. As far as I can tell you can’t do that with xmlstarlet so I need to just convert the string.

I found this thread which says I can use IFS=’ ’ read -a arr <<< “$line” which works for a basic string but not the one I’m trying to use it with:

2023-06-19T00:00:00+01:00 2023-06-18T00:00:00+01:00 2023-06-17T00:00:00+01:00 2023-06-16T00:00:00+01:00 2023-06-15T00:00:00+01:00 2023-06-14T00:00:00+01:00 2023-06-13T00:00:00+01:00 2023-06-10T00:00:00+01:00 2023-06-03T00:00:00+01:00 2023-05-31T00:00:00+01:00 2023-05-27T00:00:00+01:00

If I use the command on this string it only puts the first part in the array so I get 2023-06-19T00:00:00+01:00

I also tried arr=( $line ) which is also suggested in the thread but that does the same thing. Is there another way I can try to convert this, or a way to export from xmlstarlet straight to an array?

  • learnbyexample
    link
    fedilink
    English
    31 year ago

    Can’t reproduce your issue:

    $ line='2023-06-19T00:00:00+01:00 2023-06-18T00:00:00+01:00 2023-06-17T00:00:00+01:00 2023-06-16T00:00:00+01:00 2023-06-15T00:00:00+01:00 2023-06-14T00:00:00+01:00 2023-06-13T00:00:00+01:00 2023-06-10T00:00:00+01:00 2023-06-03T00:00:00+01:00 2023-05-31T00:00:00+01:00 2023-05-27T00:00:00+01:00'
    $ arr=( $line )
    $ echo "${arr[4]}"
    2023-06-15T00:00:00+01:00
    
  • @sin_free_for_00_days
    link
    English
    11 year ago

    What exactly is your end goal? There might be other utilities that can get you to your wanted solution easier. I, the same as learnbyexample, did not have the problem.

    [\ #27]  line="2023-06-19T00:00:00+01:00 2023-06-18T00:00:00+01:00 2023-06-17T00:00:00+01:  00 2023-06-16T00:00:00+01:00 2023-06-15T00:00:00+01:00 2023-06-14T00:00:00+01:00 2023-06-   13T00:00:00+01:00 2023-06-10T00:00:00+01:00 2023-06-03T00:00:00+01:00 2023-05-31T00:00:00+  01:00 2023-05-27T00:00:00+01:00"
    [\ #28]  IFS=' ' read -r -a array <<< "$line"
    [\ #29]  for dt in "${array[@]}"; do echo "$dt"; done
    2023-06-19T00:00:00+01:00
    2023-06-18T00:00:00+01:00
    2023-06-17T00:00:00+01:00
    2023-06-16T00:00:00+01:00
    2023-06-15T00:00:00+01:00
    2023-06-14T00:00:00+01:00
    2023-06-13T00:00:00+01:00
    2023-06-10T00:00:00+01:00
    2023-06-03T00:00:00+01:00
    2023-05-31T00:00:00+01:00
    2023-05-27T00:00:00+01:00