Simple outil de formatage bash / script, pour le texte de paragraphe dans le script?

Contexte: vous savez comment taper des phrases dans un traitement de texte et vous n’avez pas à effectuer de formatage spécial si vous insérez une nouvelle phrase dans un paragraphe ou si vous faites une phrase existante plus longue ou plus courte?

J’écris des paragraphes pour documenter ce que fait un script donné, à l’intérieur. Je veux être capable de générer cela lorsque l’utilisateur appelle le script avec une option “-help”, etc. Comment puis je faire ça?

Je suis prêt à faire la sortie de 80 colonnes ou une largeur fixe.

EDIT TO READER: Toutes les réponses sont très instructives, j’ai trouvé.

Vous pouvez utiliser l’utilitaire fmt largement disponible.

Si vous avez Gnu coreutils (que vous utiliserez certainement si vous utilisez Linux), alors vous pouvez utiliser la version Gnu . Il existe un utilitaire très similaire disponible sur de nombreux systèmes BSD, y compris Mac OS X.

Voici un exemple simple, qui devrait fonctionner avec l’une ou l’autre de ces implémentations. Notez que le deuxième paragraphe est en retrait de deux espaces, et que l’indentation est conservée:

 description="\ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean ornare leo non dolor porttitor euismod. Cras commodo, nisi vel gravida volutpat, enim turpis tempor eros, ut venenatis elit leo ut nunc. Nulla fermentum ligula id tincidunt porttitor. Morbi ut massa vitae tortor rutrum gravida ut id nunc. Integer imperdiet pharetra augue, quis finibus justo luctus id. Phasellus a diam ac risus consequat pharetra. Cras lacinia neque sed ipsum euismod, non commodo felis facilisis. Suspendisse luctus purus justo, sed iaculis lectus consequat nec. Etiam pretium ulsortingcies ligula, a pretium sapien facilisis eu. Nulla rhoncus viverra turpis a rutrum. Cras eu porttitor urna. Duis nec metus vel nisi accumsan scelerisque. Cras lectus erat, mattis non mauris in, consectetur vulputate ipsum. " fmt -w 60 <<<"$description" 

Sortie:

 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean ornare leo non dolor porttitor euismod. Cras commodo, nisi vel gravida volutpat, enim turpis tempor eros, ut venenatis elit leo ut nunc. Nulla fermentum ligula id tincidunt porttitor. Morbi ut massa vitae tortor rutrum gravida ut id nunc. Integer imperdiet pharetra augue, quis finibus justo luctus id. Phasellus a diam ac risus consequat pharetra. Cras lacinia neque sed ipsum euismod, non commodo felis facilisis. Suspendisse luctus purus justo, sed iaculis lectus consequat nec. Etiam pretium ulsortingcies ligula, a pretium sapien facilisis eu. Nulla rhoncus viverra turpis a rutrum. Cras eu porttitor urna. Duis nec metus vel nisi accumsan scelerisque. Cras lectus erat, mattis non mauris in, consectetur vulputate ipsum. 

Incorporer ce qui précède dans un script.

Vous pouvez append cela sortingvialement à un script (merci à @ninjaj pour la suggestion d'utiliser tput pour obtenir la largeur de colonne souhaitée).

 #!/bin/bash description=... # as above, not repeated for space # Check to see if the first argument is a cry for help if [[ $1 == -help ]]; then fmt -w $(tput cols) <<< "$description" exit 0 fi 

La manière classique de le faire sous UNIX / Linux est le fold . Voici un exemple:

  chicks ~ $ cat /etc/printcap | fold -w 20 # This file was auto matically generated by cupsd(8) from the # /etc/cups/printers .conf file. All cha nges to this file # will be lost. chicks ~ $ cat /etc/printcap | fold -w 40 # This file was automatically generated by cupsd(8) from the # /etc/cups/printers.conf file. All cha nges to this file # will be lost. chicks ~ $ cat /etc/printcap # This file was automatically generated by cupsd(8) from the # /etc/cups/printers.conf file. All changes to this file # will be lost. 

et pour que ça ressemble plus à un script pour Ray:

 $ echo "Ray wants to see how this works inside of a script" | fold -w 20 Ray wants to see how this works inside o fa script $ cat foo echo "Ray wants to see how this works inside of a script" | fold -w 20 $ bash foo Ray wants to see how this works inside o fa script $ 

Si je comprends ce que vous demandez, vous voulez inclure le texte décrivant le script dans le script lui-même, une méthode simple consiste à utiliser un heredoc contenant la description dans le script et à simplement tester '-h' ou '--help' pour afficher votre description. Vous pouvez gagner en souplesse en encapsulant le code hérité dans une fonction qui peut ensuite servir de fonction d’ usage générale pour répondre à une aide, afficher des conditions d’erreur et définir le code de sortie pour une situation donnée.

Un exemple rapide est:

 #!/bin/bash maxval=127 usage() { local ecode=${2:-0} test -n "$1" && printf "\n %s\n" "$1" >&2 cat >&2 << MSG usage: ${0//*\//} srcdir tgtdir [maxname] (maxname default: $maxval) This script will copy all files from 'srcdir' to 'tgtdir' with numeric names less than 'maxname'. Options: -h | --help program help (this file) -a | --all copy all files from srcdir to tgtdir MSG exit $ecode; } ## respond to help [ "$1" = -h -o "$1" = --help ] && usage ## example of error usage [ -d "somedir" ] || usage "Error: directory does not exist" 2 

Où tout entre les balises MSG comprend le heredoc . Le texte peut être aussi long ou complexe que vous le souhaitez et est beaucoup plus facile à gérer qu'une série d'instructions echo ou printf . Bien qu'il ne retransmettra pas le texte avec fmt ou flow , il est sortingvial de le maintenir et offre une alternative simple à l'utilisation d'outils tiers.

Exemple de réponse à --help

 $ bash usage.sh --help usage: usage.sh srcdir tgtdir [maxname] (maxname default: 127) This script will copy all files from 'srcdir' to 'tgtdir' with numeric names less than 'maxname'. Options: -h | --help program help (this file) -a | --all copy all files from srcdir to tgtdir 

Exemple montrant une condition d'erreur

 $ bash usage.sh Error: directory does not exist usage: usage.sh srcdir tgtdir [maxname] (maxname default: 127) This script will copy all files from 'srcdir' to 'tgtdir' with numeric names less than 'maxname'. Options: -h | --help program help (this file) -a | --all copy all files from srcdir to tgtdir $ echo $? 2