divide a linha longa em um delimitador

18

Qual comando posso usar para dividir a entrada assim:

foo:bar:baz:quux

para isso?

foo
bar
baz
quux

Estou tentando descobrir o comando cut , mas ele parece funcionar apenas com quantidades fixas de entrada, como "primeiros 1000 caracteres" ou "primeiros 7 campos". Eu preciso trabalhar com entrada arbitrariamente longa.

    
por japreiss 11.12.2012 / 16:54

4 respostas

29

Existem algumas opções:

  • tr : \n
  • sed 's/:/\n/g'
  • awk '{ gsub(":", "\n") } 1'

Você também pode fazer isso em bash :

while IFS=: read -ra line; do
    printf '%s\n' "${line[@]}"
done
    
por 11.12.2012 / 16:59
4
$ line=foo:bar:baz:quux
$ words=$(IFS=:; set -- $line; printf "%s\n" "$@")
$ echo "$words"
foo
bar
baz
quux
    
por 11.12.2012 / 22:04
4

Se o seu grep suportar -o , você pode fazer assim:

grep -o '[^:]\+'

Ou com o awk, definindo o separador de registro como : :

awk -v RS=: 1

Ou com o GNU cortado:

cut -d: --output-delimiter=$'\n' -f1-

Editar

Como observado por Chris abaixo, isso deixará uma nova linha à direita, isso pode ser evitado se o seu awk suportar a especificação de RS como uma expressão regular (testada com o GNU awk):

awk -v RS='[:\n]' 1
    
por 11.12.2012 / 17:27
-1

Em algumas cadeias, tive problemas com as soluções acima. Mas isso funcionou para mim:

echo $string | sed 's/\n/ /g' | tr " " \n
    
por 03.01.2017 / 14:00