O fold
comando do Linux traz resultados indisciplinados. Leia grandes pedaços de texto, strings infinitas e fluxos não formatados, controlando a largura da saída. Aprenda como.
Índice
Como as linhas de texto funcionam no terminal Linux
Primeira regra de combate do Linux: conheça seu inimigo. Então, vamos definir isso. O que exatamente é uma linha de texto? É uma sequência de caracteres – letras, números, símbolos e espaços em branco – que termina por um byte especial que significa “iniciar uma nova linha”. No Linux e no Unix, o caractere de nova linha , também chamado de alimentação de linha, é usado como indicador de fim de linha. Este é um byte com um valor de 0x0a em hexadecimal e dez em decimal.
Diferentes sistemas operacionais usam diferentes valores de byte para indicar o fim de uma linha. O Windows usa uma sequência de dois bytes. Em arquivos de texto do Windows, o caractere de nova linha é seguido imediatamente pelo caractere de retorno de carro , que é 0x0d em hexadecimal e treze em decimal.
Os termos “alimentação de linha” e “retorno de carro” datam da máquina de escrever . O cilindro, o cilindro em que o papel estava enrolado , era montado em um carro móvel. A carruagem moveu a largura de um caractere para a esquerda cada vez que você pressionou uma tecla. Para iniciar uma nova linha, você empurrou uma alavanca que trouxe o carro de volta à sua posição original e que girou o rolo e moveu o papel para cima na altura de uma linha. Essa ação era conhecida como retorno do carro e a rotação do cilindro (e o avanço do papel) era conhecido como avanço de linha.
A alavanca foi substituída por uma chave quando a máquina de escrever ficou eletrificada. A chave estava rotulada Retorno de carro ou apenas Retorno. Alguns computadores antigos, como o BBC Micro, ainda usavam o nome Return
no que hoje chamamos de Enter
chave.
Você não pode ver caracteres de nova linha, como regra. Você só pode ver seu efeito . O caractere de nova linha força o software que exibe ou processa texto a iniciar uma nova linha.
Mas qual é o problema com linhas longas?
Texto sem, ou com poucos caracteres de nova linha, será muito largo para ser lido confortavelmente na janela do terminal. Isso é irritante, mas é possível.
Uma questão mais perniciosa é ter que lidar com linhas de tal comprimento que representem um problema para o software que precisa processar, transmitir ou receber o texto. Isso pode ser causado por comprimentos de buffer interno ou outros aspectos do software que você não pode ajustar.
Mas há uma solução para isso, chamado fold
.
Primeiros passos com dobra
Vamos dar uma olhada em uma parte do texto que tem linhas muito, muito longas. Observe que não estamos falando de frases aqui. (Embora o texto venha do Moby Dick de Herman Melville, temos o melhor dos dois mundos.)
Uma linha de texto é tudo, desde o último caractere de nova linha (ou o início do arquivo, se for a primeira linha do arquivo) até o próximo caractere de nova linha, independentemente do que esteja entre os dois. A linha pode conter muitas frases. Ele pode aparecer na janela do terminal muitas vezes. Mas ainda é uma única linha de texto.
Vejamos o texto em sua forma bruta:
menos moby-dick.txt
O texto é exibido em less
:
O texto se estende de uma borda a outra da janela, e os contornos de linha são feios e quebram as palavras no meio.
Temos outra versão do arquivo com linhas curtas:
menos short-lines-moby-dick.txt
As linhas neste arquivo são muito mais curtas. Cada linha é encerrada com um caractere de nova linha.
Se usarmos o hexdump
comando, podemos olhar os valores de byte dentro do arquivo e ver os caracteres de nova linha. A -C
opção (canônica) formata a saída para mostrar valores hexadecimais no corpo principal da tela com os equivalentes de texto em uma coluna ao lado. Vamos canalizar a saída para less
:
hexdump -C short-lines-moby-dick.txt | Menos
Ao pressionar a barra “ /
”, você entrará less
na função de pesquisa de. Digite “0a” e pressione Enter
. Os caracteres de nova linha serão destacados no texto. Você pode percorrer o arquivo e ver onde eles aparecem. Se necessário, você pode rolar a saída para os lados usando as teclas Left Arrow
e Right Arrow
.
Ter um caractere de nova linha no final de cada linha pode ser uma limitação em si. Não importa qual programa ou janela exiba este texto, as linhas não podem se adaptar a janelas com uma largura maior do que as próprias linhas. O comprimento da linha foi limitado pelos caracteres de nova linha.
Portanto, existem problemas com linhas longas e linhas curtas semelhantes.
Reduzindo Longas Linhas
O fold
comando tem uma opção -w
(largura) que permite especificar uma nova largura máxima para uma seção de texto. Exibiremos o texto Moby Dick com uma largura máxima de 50 caracteres:
fold -w 50 moby-dick.txt
O texto é exibido na janela do terminal, com o novo comprimento máximo de arquivo. O arquivo original não foi alterado. É apenas a saída fold
que é reformatada.
À primeira vista, isso parece muito melhor. Mas as palavras ainda estão se dividindo no meio, no final das linhas. É definitivamente mais fácil de ler, mas algumas das quebras de palavras estranhas são chocantes.
Embora pareça que a margem direita do texto oscila para dentro e para fora, todos os comprimentos de linha são iguais. As linhas que parecem ser um caractere mais curtas que o resto acabam em um caractere de espaço.
Divisão de linhas em espaços
Podemos usar a -s
opção (espaços) para garantir que as linhas sejam divididas apenas em caracteres de espaço e que nenhuma palavra seja quebrada em duas linhas.
fold -w 50 -s moby-dick.txt
A saída agora tem uma margem direita irregular, mas é mais fácil de ler. Todas as palavras terminam nas linhas em que começaram.
Tornando as linhas curtas mais longas
Além de tornar as linhas longas mais curtas, podemos usar fold
para remover os comprimentos de linha obrigatórios de linhas mais curtas.
fold -w 75 short-lines-moby-dick.txt
Os caracteres de nova linha são removidos e o texto agora quebra no ou antes do comprimento máximo atribuído.
Tornando as alterações permanentes
fold
não pode modificar o arquivo original. Se quiser manter as alterações, você terá que redirecionar a saída fold
para um novo arquivo. Vamos redirecionar a saída para um arquivo denominado “modified-moby-dick.txt ”.
fold -w 75 -s short-lines-moby-dick.txt> modificado-moby-dick.txt
Vamos dar uma olhada em nosso novo arquivo:
menos modificado-moby-dick.txt
Como está nosso novo arquivo?
O texto agora está se ajustando perfeitamente em nossa nova largura de linha, que é maior do que o comprimento de linha do arquivo original.
Usando o fold com streams
Podemos usar fold
para reformatar fluxos de texto. Não se restringe a trabalhar apenas com arquivos. Vamos ver como é a saída bruta da journalctl
ferramenta. A -f
opção (seguir) mostra as entradas mais recentes no systemd
diário e as atualizações à medida que chegam novas entradas .
sudo journalctl -f
A saída quebra na borda da janela do terminal.
Não parece tão ruim, mas para fins de demonstração, vamos reduzir um pouco sua largura. Vamos canalizar a saída de journalctl
para fold
. Estamos definindo a largura máxima para 65 caracteres e quebrando as linhas apenas em espaços.
sudo journalctl -f | fold -w 65 -s
A tela parece um pouco menos opressiva e um toque mais elegante também.
As paredes de texto sólido podem parecer impenetráveis. Eles são desanimadores e difíceis de lidar. Quando você precisar ver o bosque das árvores, invoque fold
e imponha um pouco de ordem.