$ awk 'length > 72' {HOW TO PRINT THE LINEs IN PCS?} msg
c'est-à-dire que je veux l'ajouter \n
après 72 caractères et continuer, donc au début, vous devrez peut-être supprimer tous les \n
s et les ajouter. Cela peut être plus facile avec un autre outil, mais essayons de awk.
[Mise à jour]
Williamson a fourni la bonne réponse, mais une aide était nécessaire pour la lire. Je divise le problème en plusieurs parties avec des exemples plus simples, ci-dessous.
Pourquoi le code ci-dessous s'imprime
\t
dans les deux cas,gsub
devrait remplacer les choses? x est un fichier factice, un 0 impair à la fin.Attaquer la ligne
line = $0 \n more = getline \n gsub("\t"," ")
dans la réponse de Williamson ,line
obtient apparemment toute la sortie tout enmore
obtenant une valeur sautée$0
, non?
Code à la partie 1
$ gawk '{ hallo="tjena\t tjena2"; gsub("\t"," "); }; END {print hallo; gsub("\t", ""); hallo=hallo gsub("\t",""); print hallo }' x
tjena tjena2
tjena tjena20
la source
Ne pas utiliser awk
Je comprends que cela peut simplement être une partie d'un problème plus vaste que vous essayez de résoudre en utilisant
awk
ou simplement une tentative de mieux comprendre awk, mais si vous voulez vraiment garder votre longueur de ligne à 72 colonnes, il existe un bien meilleur outil.L'
fmt
outil a été conçu spécifiquement dans cet esprit:fmt
essaiera également de briser les lignes à des endroits raisonnables, ce qui rendra la sortie plus agréable à lire. Voir lainfo
page pour plus de détails sur ce que l'onfmt
considère comme des «endroits raisonnables».la source
width
signifie des octets, pas des caractères.fold -s -w 72
fold
fonctionnera également sur les systèmes GNU (livré avec GNUcoreutils
).Awk est un langage complet de Turing, et pas particulièrement obscur, il est donc assez facile de tronquer des lignes. Voici une version impérative simple.
Si vous voulez tronquer les lignes entre les mots, vous pouvez le coder en awk, mais la reconnaissance des mots n'est pas triviale (pour des raisons ayant plus à voir avec les langues naturelles qu'avec des difficultés algorithmiques). De nombreux systèmes ont un utilitaire appelé
fmt
qui fait exactement cela.la source
Voici une fonction Awk qui se casse sur les espaces:
Étonnamment, c'est plus performant que le pli ou le fmt .
La source
la source
Vous avez demandé pourquoi le
awk
code a émis des onglets et d'où vient le zéro.Le code ne modifie pas la
hello
chaîne avec lesgsub()
appels. Avec deux arguments,gsub()
agit$0
. Pour réellement modifier lahallo
variable, utilisezgsub(..., ..., hallo)
.Vous obtenez le zéro à la fin de la chaîne car
gsub()
renvoie le nombre de substitutions effectuées et à un moment donné, vous ajoutez ce nombre à la valeur dehallo
.Je connais au moins trois utilitaires spécialement conçus pour habiller et formater les paragraphes de texte:
fold
, "filtre pour lignes de pliage", qui est un utilitaire POSIX standard . Il insère simplement les nouvelles lignes et ne redistribue pas le texte.fmt
, "simple text formatter", qui est également souvent installé sur les systèmes Unix par défaut et un peu plus intelligent quefold
lorsqu'il s'agit de redistribuer des paragraphes.par
, " filtre pour reformater les paragraphes ", qui a des capacités supplémentaires pour détecter les préfixes et suffixes de paragraphe (comme un texte avec une boîte ASCII autour, ou des commentaires dans un peu de code source), et gère les indentations et les retraits suspendus un peu mieux quefmt
.la source
En utilisant Gensub, pour obtenir la
fold
sémantique, vous pouvez exécuter quelque chose dans le sens dela source