$ awk 'length > 72' {HOW TO PRINT THE LINEs IN PCS?} msg
ou seja, eu quero adicionar \n
depois de 72 caracteres e continuar, portanto, inicialmente, você pode precisar remover todos os \n
s e adicioná-los. Pode ser mais fácil, mais fácil com outra ferramenta, mas vamos tentar o awk.
[Atualizar]
Williamson forneceu a resposta certa, mas foi necessária alguma ajuda para lê-la. Divido o problema em partes com exemplos mais simples, abaixo.
Por que o código abaixo é impresso
\t
nos dois casos,gsub
deve substituir as coisas? x é um arquivo fictício, alguns 0 ímpares no final.Atacando a linha
line = $0 \n more = getline \n gsub("\t"," ")
na resposta de Williamson ,line
aparentemente fica totalmente desatualizado, enquanto omore
valor é disparado$0
, certo?
Código para a parte 1
$ gawk '{ hallo="tjena\t tjena2"; gsub("\t"," "); }; END {print hallo; gsub("\t", ""); hallo=hallo gsub("\t",""); print hallo }' x
tjena tjena2
tjena tjena20
fonte
Não está usando o awk
Entendo que isso pode ser apenas parte de um problema maior que você está tentando resolver usando
awk
ou simplesmente uma tentativa de entender melhor o awk, mas se você realmente deseja apenas manter o comprimento da linha em 72 colunas, há uma ferramenta muito melhor.A
fmt
ferramenta foi projetada com isso especificamente em mente:fmt
também tentará arduamente quebrar as linhas em locais razoáveis, tornando a saída mais agradável de ler. Veja ainfo
página para mais detalhes sobre o quefmt
considera "lugares razoáveis".fonte
width
significa bytes, não caracteres.fold -s -w 72
fold
também funcionará em sistemas GNU (vem com o GNUcoreutils
).O awk é uma linguagem completa de Turing, e não particularmente ofuscada, por isso é fácil o suficiente para truncar linhas. Aqui está uma versão imperativa direta.
Se você deseja truncar linhas entre as palavras, pode codificá-las no awk, mas reconhecer as palavras não é trivial (por motivos que têm mais a ver com linguagens naturais do que com dificuldade algorítmica). Muitos sistemas têm um utilitário chamado
fmt
que faz exatamente isso.fonte
Aqui está uma função do Awk que quebra nos espaços:
Surpreendentemente, isso é mais eficiente do que fold ou fmt .
Fonte
fonte
Você perguntou por que o
awk
código emitiu guias e de onde veio o zero.O código não modifica a
hello
sequência com asgsub()
chamadas. Com dois argumentos,gsub()
atua$0
. Para realmente modificar ahallo
variável, usegsub(..., ..., hallo)
.Você obtém o zero no final da string porque
gsub()
retorna o número de substituições feitas e, em um ponto, você anexa esse número ao valor dehallo
.Estou ciente de pelo menos três utilitários especificamente para agrupar e formatar parágrafos de texto:
fold
, "filtro para linhas dobráveis", que é um utilitário POSIX padrão . Simplesmente insere novas linhas e não reflui o texto.fmt
, "formatador de texto simples", que também é frequentemente instalado nos sistemas Unix por padrão e um pouco mais inteligente do quefold
quando se trata de parágrafos refletidos.par
, " filtro para reformatar parágrafos ", que possui recursos adicionais para detectar prefixos e sufixos de parágrafos (como um texto com uma caixa ASCII ao redor ou comentários em um pouco de código-fonte), além de lidar com indentação e indentações pendentes um pouco melhor quefmt
.fonte
Usando o gensub, para obter
fold
semântica, você pode executar algo ao longo das linhas defonte