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") >