Existe um comando ou conjunto de comandos que posso usar para alinhar linhas de texto horizontalmente a um caractere arbitrário? Por exemplo, com uma lista de endereços de e-mail, a saída produziria um arquivo de texto com todos os caracteres '@' alinhados verticalmente.
Para ter sucesso, acredito que um número variável de espaços vazios deve ser adicionado ao início da maioria das linhas. Não quero colunas separadas, pois exigem mais esforço para ler (por exemplo, column -t -s "@" < file.txt
).
Antes da:
[email protected]
[email protected]
[email protected]
Depois:
[email protected]
[email protected]
[email protected]
Em outras palavras: posso especificar um caractere para ser um ponto de ancoragem, em torno do qual o texto ao redor é centralizado horizontalmente? Meu caso de uso para isso são endereços de e-mail, para torná-los mais fáceis de digitalizar visualmente.
Na sua forma mais simples, você pode apenas imprimir o primeiro campo em uma largura de campo adequadamente grande, por exemplo
AFAIK qualquer método que não assuma uma largura de campo máxima específica exigirá manter o arquivo na memória ou fazer duas passagens.
solução hacky, assume muito sobre o texto de entrada
Uma solução rápida do Python que usa o comprimento de preenchimento mais curto possível que alinha à direita todas as strings à esquerda do separador:
Uso:
NÃO Ah! Apenas
sed
ecolumn
:Resultado:
Agora, pensando bem, isso é quase o mesmo que a solução do Sundeep, apenas parece mais curto / tem menos chamadas para
sed
, e também assume que isso@
acontece apenas uma vez em cada linha.Outra solução GNU
awk
+column
:A saída:
Isso também pode funcionar com manipulação de string Bash.
Script Bash (4.x):
O resultado:
Tente
column
com--table-right
Aqui está a entrada sem qualquer formatação:
Aqui está uma primeira tentativa, que não faz exatamente o que queremos:
Aqui está uma outra tentativa. Mas desta vez com a
--table-right 1
opção adicionada. Isso alinha a coluna 1 à direita (as colunas começam em 1) e faz o que queríamos:Ou se preferir as opções curtas: