Supondo que você tenha uma sequência com espaços como separadores:
newline_separated=${space_separated// /$'\n'}
No entanto, você provavelmente está fazendo a pergunta errada. (Não necessariamente, por exemplo, isso pode aparecer em um makefile.) Uma lista de nomes de arquivos separados por espaço não funciona realmente: e se um dos nomes de arquivos contivesse espaços?
Se um programa receber nomes de arquivos como argumentos, não os junte a espaços. Use "$@"
para acessá-los um por um. Embora echo "$@"
imprima os argumentos com espaços no meio, isso se deve a echo
: imprime seus argumentos com espaços como separadores. somecommand "$@"
passa os nomes dos arquivos como argumentos separados para o comando Se você deseja imprimir os argumentos em linhas separadas, pode usar
printf '%s\n' "$@"
Se você possui nomes de arquivos separados por espaço e deseja colocá-los em uma matriz para trabalhar com eles, pode usar uma expansão de variável não citada para dividir o valor em caracteres IFS
(você precisará desativar a expansão de curinga com set -f
, caso contrário, glob os padrões serão expandidos no 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 …
Você pode encapsular isso em uma função que restaura a -f
configuração e o valor de IFS
quando é feito:
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 …