Aqui está uma abordagem híbrida perl / fold:
$ echo "The cat hopped in a box." | fold -w 1 |
perl -lne 'push @k, "$_ "; push @l,sprintf "%-2s",$.; END{print "@k\n@l"}'
T h e c a t h o p p e d i n a b o x .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
Explicação
-
fold -w 1
: isso irá dobrar a entrada em uma largura de um caractere, resultando em cada caractere de entrada impresso em uma linha separada. -
perl -lne
: o-l
remove as novas linhas à direita da entrada e adiciona uma nova linha a cadaprint
chamada; on
lê a entrada linha a linha e oe
fornece o script para ser executado nele. -
push @k, " $_";
: Adicione um espaço à linha atual ($_
) e salve-o no array@k
. -
push @l,sprintf "%-2s",$.;
:sprintf
retornará uma string formatada, aqui estamos dando a ela o número da linha atual ($.
) e informando para imprimi-la com espaços adicionados conforme necessário para fazer seu comprimento 2. A string é então adicionada a a matriz@l
. -
END{print "@k\n@l"}'
: assim que todo o arquivo for lido, imprima os dois arrays.
Se você precisar apenas numerar os caracteres e não se importar com a saída de várias linhas, uma abordagem mais simples é (usando uma string mais curta para simplificar):
$ echo "foo bar" | fold -w1 | cat -n
1 f
2 o
3 o
4
5 b
6 a
7 r