¿Cómo convierto una variable de matriz bash en una cadena delimitada con nuevas líneas?

¿Cómo convierto una variable de matriz bash en una cadena delimitada con nuevas líneas?

Quiero escribir una variable de matriz bash en un archivo, con cada elemento en una nueva línea. Podría hacer esto con un bucle for, pero ¿hay otra forma (más limpia) de unir los elementos \n?

Respuesta1

A continuación se muestra una forma que utiliza la expansión de parámetros de bash y su IFSvariable especial.

$ System=('s1' 's2' 's3' 's4 4 4')
$ ( IFS=$'\n'; echo "${System[*]}" )

Usamos una subcapa para evitar sobrescribir el valor de IFSen el entorno actual. En esa subcapa, luego modificamos el valor de IFSpara que el primer carácter sea una nueva línea (usando $'...'comillas). Finalmente, usamos la expansión de parámetros para imprimir el contenido de la matriz como una sola palabra; cada elemento está separado por el primer carácter deIFS .

Para capturar a una variable:

$ var=$( IFS=$'\n'; echo "${System[*]}" )

Si tu bash es lo suficientemente nuevo (4.2 o posterior), aún puedes (y debes) usarlo printfcon la -vopción:

$ printf -v var "%s\n" "${System[@]}"

En cualquier caso, es posible que no desee la nueva línea final en var. Para eliminarlo:

$ var=${var%?}    # Remove the final character of var

Respuesta2

Puede utilizar printfpara imprimir cada elemento de la matriz en su propia línea:

 $ System=('s1' 's2' 's3' 's4 4 4')
 $ printf "%s\n"  "${System[@]}"
s1
s2
s3
s4 4 4

Respuesta3

awk -v sep='\n' 'BEGIN{ORS=OFS="";for(i=1;i<ARGC;i++){print ARGV[i],ARGC-i-1?sep:""}}' "${arr[@]}"

o

perl -le 'print join "\n",@ARGV' "${arr[@]}"

o

python -c 'import sys;print "\n".join(sys.argv[1:])' "${arr[@]}"

o

sh -c 'IFS=$'\''\n'\'';echo "$*"' '' "${arr[@]}"

o

lua <(echo 'print(table.concat(arg,"\n"))') "${arr[@]}"

o

tclsh <(echo 'puts [join $argv "\n"]') "${arr[@]}"

o

php -r 'echo implode("\n",array_slice($argv,1));' -- "${arr[@]}"

o

ruby -e 'puts ARGV.join("\n")' "${arr[@]}"

eso es todo lo que puedo recordar hasta ahora.

Respuesta4

Usandopara:

for each in "${alpha[@]}"
do
  echo "$each"
done

Usandohistoria; tenga en cuenta que esto fallará si sus valores contienen !:

history -p "${alpha[@]}"

Usandonombre base; tenga en cuenta que esto fallará si sus valores contienen /:

basename -a "${alpha[@]}"

Usandoshuf; tenga en cuenta que es posible que los resultados no aparezcan en orden:

shuf -e "${alpha[@]}"

información relacionada