Suponiendo que tiene una cadena con espacios como separadores:
newline_separated=${space_separated// /$'\n'}
Sin embargo, probablemente estés haciendo la pregunta equivocada. (No necesariamente, por ejemplo, esto podría aparecer en un archivo MAKE). Una lista de nombres de archivos separados por espacios no funciona realmente: ¿qué pasa si uno de los nombres de archivo contiene espacios?
Si un programa recibe nombres de archivo como argumentos, no los una con espacios. Use "$@"
para acceder a ellos uno por uno. Aunque echo "$@"
imprime los argumentos con espacios intermedios, eso se debe a echo
: imprime sus argumentos con espacios como separadores. somecommand "$@"
pasa los nombres de archivo como argumentos separados al comando. Si desea imprimir los argumentos en líneas separadas, puede usar
printf '%s\n' "$@"
Si tiene nombres de archivo separados por espacios y desea colocarlos en una matriz para trabajar en ellos, puede usar una expansión de variable sin comillas para dividir el valor en los caracteres IFS
(necesitará deshabilitar la expansión de comodín con set -f
, de lo contrario, glob los patrones se expandirán en el valor):
space_separated_list='/path/to/file1 /path/to/file2 /path/to/file3'
IFS=' '; set -f
eval "array=(\$space_separated_list)"
for x in "${array[@]}"; do …
Puede encapsular esto en una función que restaura la -f
configuración y el valor de IFS
cuando se hace:
split_list () {
local IFS=' ' flags='+f'
if [[ $- = *f* ]]; then flags=; fi
set -f
eval "$1=($2)"
set $flags
}
split_list array '/path/to/file1 /path/to/file2 /path/to/file3'
for x in "${array[@]}"; do …