Linux / Comando fmt: ajustar quebras de linha em parágrafos
fmt reorganiza as quebras de linha de parágrafos de texto simples e envia o resultado para a saída padrão. Ele pode juntar linhas curtas e dividir linhas longas entre palavras, sem alterar o arquivo de entrada. É útil para notas e rascunhos cuja disposição das linhas ficou irregular.
Use-o em prosa, depois de conferir uma amostra. Código-fonte, dados em CSV (valores separados por vírgulas), tabelas Markdown e registros em que cada linha representa um evento dependem de uma estrutura que fmt não interpreta.
Sintaxe e implementação
fmt [opção...] [arquivo...]
A sintaxe acima contém marcadores, não um comando pronto para copiar. Sem arquivo, ou com - como argumento, fmt lê a entrada padrão. Confira fmt --version, fmt --help e man fmt para saber quais opções a implementação instalada aceita.
Os exemplos foram conferidos com GNU fmt 8.32 no Bash do Git para Windows, usando arquivos locais com finais de linha LF. No GNU fmt, a largura padrão é 75, e a largura pretendida para o ajuste costuma ser um pouco menor; não espere linhas preenchidas exatamente até a última coluna.
Preparar os arquivos e reorganizar um parágrafo
Execute o bloco inteiro no Bash, em uma pasta onde possa criar arquivos. Ele prepara notes.txt e draft.txt em um diretório exclusivo. Os parênteses criam um subshell: ao terminar, a sessão permanece no diretório anterior. set -eu interrompe este bloco simples diante de erros não tratados ou variáveis não definidas.
(
set -eu
labdir=$(mktemp -d ./fmt-demo.XXXXXX)
cd "$labdir"
printf 'one two\nthree four\n\nfive six\nseven eight\n' > notes.txt
printf 'alpha beta gamma delta epsilon zeta eta theta iota kappa lambda mu nu xi omicron pi rho sigma tau upsilon phi chi psi omega.\n' > draft.txt
fmt notes.txt
printf 'Arquivos do laboratório: %s\n' "$PWD"
)
O comando fmt notes.txt junta one two com three four e, separadamente, five six com seven eight. O resultado tem one two three four, uma linha vazia e five six seven eight. A linha vazia mantém a separação entre os dois parágrafos; as palavras em inglês são dados da prática.
A última linha informa o caminho completo do laboratório. Entre nessa pasta com cd e aspas antes de executar os próximos comandos. Os arquivos de entrada permanecem disponíveis para comparação.
Escolher a largura com -w
Para reorganizar draft.txt com largura 60, execute:
fmt -w 60 draft.txt
-w 60 define a largura usada pelo GNU fmt para distribuir as palavras. Na amostra preparada, o texto aparece em várias linhas de até 60 caracteres ASCII. Isso não significa que todas terão 60 caracteres: o programa escolhe onde quebrar o parágrafo. Compare com fmt -w 72 draft.txt usando a mesma entrada.
Há uma exceção prática: fmt não quebra uma palavra longa ao meio só para respeitar a largura. Por exemplo, printf 'abcdefghijklmnopqrstuvwxy\n' | fmt -w 10 mantém os 25 caracteres na mesma linha na versão conferida. A largura solicitada não é uma garantia de corte rígido.
Salvar em outro arquivo e conferir
O comando abaixo mantém a leitura de draft.txt e grava a saída em draft-formatted.txt. Execute-o uma vez na pasta da prática. A opção set -C, incluída em set -euC, faz o Bash recusar esse redirecionamento se o destino já for um arquivo regular existente.
(
set -euC
fmt -w 72 draft.txt > draft-formatted.txt
)
Leia o resultado com cat draft-formatted.txt. Para comparar a disposição das linhas, use diff -u draft.txt draft-formatted.txt: diferenças de formatação são esperadas. O status 1 de diff indica diferenças; ele não significa, por si só, que fmt falhou. Confira também se as palavras e a separação dos parágrafos continuam corretas.
Não escolha o próprio arquivo de entrada como destino do redirecionamento: o shell pode truncá-lo antes de fmt começar a ler. Se o destino protegido já existir, inspecione-o e escolha outro nome. Para desfazer esta prática, volte a usar o arquivo de entrada, que foi mantido separado; não é necessário substituir o original pelo resultado.
Entender o exemplo de largura 20
Este comando dispensa arquivos e permite observar a distribuição de seis palavras:
printf 'one two three four five six\n' | fmt -w 20
No GNU fmt 8.32 conferido, a saída é:
one two three four
five six
A primeira linha tem 18 caracteres ASCII e a segunda tem 8, sem contar a quebra de linha. As palavras permanecem inteiras. O resultado depende das regras de distribuição de parágrafos e pode variar com a implementação e as opções; não use fmt para produzir campos de largura fixa.
Usar -s, -u e -p conforme o objetivo
-s divide linhas longas, mas não junta linhas curtas. Compare printf 'one two\nthree four\n' | fmt -w 20, que produz uma linha, com printf 'one two\nthree four\n' | fmt -s -w 20, que mantém as duas linhas. A opção não transforma fmt em um analisador de código ou tabelas.
-u uniformiza os espaços: um entre palavras e dois entre frases reconhecidas pelo programa. Por exemplo, printf 'One\040\040\040\040word.\040\040\040Next\040\040\040sentence.\n' | fmt -u -w 40 usa \040 para representar cada espaço de entrada. O resultado tem One word., dois espaços e Next sentence.. Essa regra de reconhecimento de frases não equivale a uma revisão gramatical do português.
-p prefixo limita a reformatação às linhas com o prefixo indicado, que pode ser precedido por espaços. O prefixo é recolocado nas linhas produzidas. Para conferir, printf '# one two three four five six\nplain\040\040\040untouched\n' | fmt -p '# ' -w 20 reorganiza a linha com # e mantém a linha sem o prefixo, inclusive seus três espaços entre plain e untouched. As aspas preservam o espaço no argumento '# '; aqui # faz parte dos dados.
Distinguir fmt de fold e revisar a estrutura
Use fmt para redistribuir palavras de um parágrafo. Use fold quando precisar dobrar cada linha por largura sem juntar linhas curtas do arquivo. Fold também pode dividir uma palavra longa; a escolha depende de preservar palavras ou impor quebras em cada linha. Nenhum dos dois entende automaticamente a estrutura de uma tabela Markdown ou de um arquivo CSV.
Revise a indentação, as linhas vazias e as listas. No GNU fmt, linhas sucessivas com recuos diferentes não são reunidas normalmente; isso não garante que uma estrutura complexa de listas ou citações permaneça correta. A opção -s também precisa de conferência antes de ser aplicada a texto estruturado.
Texto com acentos, tabulações e caracteres largos exige uma verificação na implementação e no ambiente de destino. Os limites de 18 e 8 deste exercício são de texto ASCII, não uma promessa sobre a largura visual de qualquer texto Unicode. Confira a saída no terminal ou editor em que ela será lida.
Opções principais
| Opção | Uso |
|---|---|
-w N |
Define a largura de ajuste; palavras longas podem ultrapassá-la. |
-s |
Divide linhas longas sem juntar linhas curtas. |
-u |
Usa um espaço entre palavras e dois entre frases reconhecidas. |
-p prefixo |
Reformata linhas com esse prefixo e o recoloca na saída. |
Pergunta frequente
O fmt modifica o arquivo original?
Ao receber um arquivo de entrada, fmt lê seu conteúdo e escreve na saída padrão. A gravação ocorre quando você redireciona essa saída. Use outro destino e revise-o antes de substituir qualquer arquivo; um redirecionamento inadequado pode apagar a entrada mesmo que fmt não seja um editor no local.
Documentação
A documentação oficial do GNU fmt detalha as regras de parágrafos e os prefixos. A página de manual de fmt publicada pelo Debian reúne as opções. Para interpretar diferenças na comparação dos arquivos, consulte o comando diff.




