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
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.
$ line=foo:bar:baz:quux
$ words=$(IFS=:; set -- $line; printf "%s\n" "$@")
$ echo "$words"
foo
bar
baz
quux
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-
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
Em algumas cadeias, tive problemas com as soluções acima. Mas isso funcionou para mim:
echo $string | sed 's/\n/ /g' | tr " " \n
Tags text-processing shell