Como posso substituir espaços por novas linhas em uma entrada como:
/path/to/file /path/to/file2 /path/to/file3 /path/to/file4 /path/to/file5
etc ...
Para obter o seguinte:
/path/to/file
/path/to/file2
/path/to/file3
/path/to/file4
/path/to/file5
Nota
Estou postando esta pergunta para ajudar outros usuários, não foi fácil encontrar uma resposta útil no UNIX SE até começar a digitar esta pergunta. Depois disso, encontrei o seguinte:
Pergunta relacionada
bash
text-processing
string
laconbass
fonte
fonte
Respostas:
Use o
tr
comandoEncontrado em http://www.unix.com/shell-programming-scripting/67831-replace-space-new-line.html
fonte
tr
é, no entanto!Nesse caso, eu usaria printf:
Se houver espaços dentro de um dos caminhos, é possível citar esse caminho de arquivo para impedir que ele seja dividido nos espaços:
Transformar texto em geral,
tr
é sua melhor aposta, conforme coberto em uma resposta existente.fonte
Supondo que você tenha uma sequência com espaços como separadores:
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. Emboraecho "$@"
imprima os argumentos com espaços no meio, isso se deve aecho
: 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 usarSe 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 comset -f
, caso contrário, glob os padrões serão expandidos no valor):Você pode encapsular isso em uma função que restaura a
-f
configuração e o valor deIFS
quando é feito:fonte
set -f
eIFS
no manual do bash se você quiser todos os detalhes. Veja também unix.stackexchange.com/questions/16192/…IFS
localmente não terá efeitoSeja pragmático, use sed !!
O texto acima diz para substituir um ou mais caracteres de espaço em branco (\ s +) por nova linha (\ n)
Isto é mais ou menos:
fonte
Como alternativa ao
tr
@laconbass, você também pode usarxargs
neste caso:A vantagem é que ele funciona mesmo com vários espaços em branco, o que
tr
não funciona.fonte
Aqui está como eu fiz isso:
Observe o uso da tecla Enter após a barra invertida no
sed
comando.fonte
sed
acaboutr
?sed
, pois é um editor, em vez de simplesmente traduzir caracteres.sed
pode fazer muito mais, mas é um exagero para isso.tr
é a ferramenta certa para ESTE trabalho, mas o conhecimentosed
e as expressões regulares certamente serão úteis mais tarde!Outra abordagem, assumindo que a linha esteja em uma variável chamada
line
:Isso usa o fato de que o Bash divide seus argumentos em espaço em branco por padrão e que
echo
acrescenta uma nova linha à sua entrada por padrão.fonte
é outro método para transformar palavras separadas por espaço único em nova linha separada.
fonte
O script a seguir é fácil de entender e fácil de usar.
fonte
tr
) é a mesma da resposta aceita. Além de sua resposta ter os seguintes problemas: a) o comando não é recuado com 4 espaços (-> layout de remarcação) b) Seu uso decat
é inútil (você pode substituí-lo por< filename tr ' ' '\n'
). c) O nome do arquivo de saída é igual ao nome do arquivo de entrada. Com isso, você cria uma corrida de dados.