Re: delimiters with more than one character? ...
On Thu, Jul 16, 2020 at 09:57:12AM -0400, Greg Wooledge wrote:
> On Thu, Jul 16, 2020 at 03:52:01PM +0200, Thomas Schmitt wrote:
> > I tried
> >
> > echo " 34 + 45 \| abc \| 1 2 3 \| c\|123abc " | \
> > sed -e 's/\\|/\n/g' | \
> > mapfile -t _S_AR
> >
> > with no visible effect on the array _S_AR. bash 4.3.30 and 5.0.11.
>
> You can't use a pipeline, because each command in the pipeline runs in
> a separate subshell.
>
> > This works
> >
> > echo " 34 + 45 \| abc \| 1 2 3 \| c\|123abc " | sed -e 's/\\|/\n/g' >/tmp/x
> >
> > mapfile -t _S_AR < /tmp/x
>
> Yes. Temp files are fine.
And mount /tmp as ramdisk ftw.
> > A workaround without temporary file would be
> >
> > x=" 34 + 45 \| abc \| 1 2 3 \| c\|123abc "
> > split=$(echo "$x" | sed -e 's/\\|/\n/g')
> > end=$(echo -n "$x" | sed -e 's/./+/g')"+"
> >
> > mapfile -t _S_AR <<$end
> > $split
> > $end
>
> No... just use the process substitution that I showed you already.
>
> mapfile -t myarray < <(some command)
>
> Do you need an actual demonstration?
>
> unicorn:~$ f() { printf '%s\n' ' one ' 'two' 't h r e e'; }
> unicorn:~$ mapfile -t a < <(f)
> unicorn:~$ declare -p a
> declare -a a=([0]=" one " [1]="two" [2]="t h r e e")
>
Reply to: