Page 1 sur 1

[sh] cherche commande pour afficher le contenu d'un fichier avec CPL fixe (résolu)

Publié : ven. 29 janv. 2016, 10:13
par bobo
Je cherche une commande shell pour afficher le texte contenu dans un fichier avec un nombre de caractères maximum par ligne, sans couper les mots.

C'est pour ne plus me prendre la tête avec le formatage de certains fichiers texte pour afficher de l'aide dans un terminal. Du coup je pourrais écrire des paragraphes plutôt que de gérer le formatage à la main.

Si vous avez une piste/solution je suis preneur.

Re: [sh] cherche commande pour afficher le contenu d'un fichier avec CPL fixe

Publié : ven. 29 janv. 2016, 10:26
par Moviuro
Y'a vim qui le propose : http://vim.wikia.com/wiki/Automatic_word_wrapping

J'ai pas mon PC sous la main, lais il y a une commande pour reformater un paragraphe déjà écrit.

Re: [sh] cherche commande pour afficher le contenu d'un fichier avec CPL fixe

Publié : ven. 29 janv. 2016, 10:53
par benjarobin
Tout simplement la commande : wrap dans le paquet talkfilters
Si tu n'as pas envie d'avoir tout le "bordel" qui va avec ce paquet (dommage de ne pas l'avoir splitté), tu peux installer wrap-git qui a plus d'option (ce n'est pas le même programme)

Re: [sh] cherche commande pour afficher le contenu d'un fichier avec CPL fixe

Publié : ven. 29 janv. 2016, 11:32
par bobo
Super benjarobin ! :chinois: Grâce à ta piste j'ai trouvé fold (qui épargne un pipe). Je cherchais une ligne de commande adéquate pour rentrer dans ce script :

Code : Tout sélectionner

#!/bin/sh

if [ !  "$(dirname "$0")" = '.' ]; then
	echo "ERROR: this script must be run locally"
fi

CPL=80

for file in * ; do
	if [ -d $file ]; then
		echo "SKIPPED (dir)   $file"
	elif [ -x $file ]; then
		echo "SKIPPED (exec)  $file"
	else
		echo "REFORMATED      $file"
	fi
done
Celle-ci pourrait être pas mal :

Code : Tout sélectionner

fold -w 80 -s $file > $file
L'idéal serait d'avoir une première étape pour rassembler les paragraphes. Si vous aviez une idée à ce sujet aussi, j'aurais un début de truc que je pourrais exécuter dans ma procedure de release pour mon projet.

Re: [sh] cherche commande pour afficher le contenu d'un fichier avec CPL fixe

Publié : ven. 29 janv. 2016, 11:53
par bobo
Illustration du propos :

Code : Tout sélectionner

$ echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | fold -w 20
xxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxx

Code : Tout sélectionner

$ echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | fold -w 20 | fold -w 40
xxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxx

Re: [sh] cherche commande pour afficher le contenu d'un fichier avec CPL fixe

Publié : ven. 29 janv. 2016, 12:48
par benjarobin
Ne jamais lire un fichier et écrire dans le même fichier. Tu pourrais avoir des trucs bien étranges...
Tu dois passer par un fichier temporaire.
L'idéal serait d'avoir une première étape pour rassembler les paragraphes.
Cela veut dire quoi ? Tout mettre sur la même ligne puis appliquer fold ?

Re: [sh] cherche commande pour afficher le contenu d'un fichier avec CPL fixe

Publié : ven. 29 janv. 2016, 13:01
par bobo
benjarobin a écrit :Tout mettre sur la même ligne puis appliquer fold ?
Je dirais plus tout mettre sur « la même ligne sauf s'il y a une ligne blanche (critère pour distinguer les paragraphes) ». En fait, à la réflexion il y aurait aussi d'autre exceptions pour les conventions que j'utilise actuellement. Si je veux faire plus malin, il va falloir passer par du perl, je le crains.

Sinon il va falloir que je modifie ma façon de rédiger mes fichiers texte. Le markdown a l'air pas mal comme approche, du coup tu peux imaginer les exceptions qu'il faudrait…

Je vais marquer le sujet comme résolu. Merci.

Re: [sh] cherche commande pour afficher le contenu d'un fichier avec CPL fixe (résolu)

Publié : ven. 29 janv. 2016, 13:19
par benjarobin
Il suffit donc de remplacer un saut de ligne par un espace uniquement si le saut de ligne n'est pas suivi par un autre saut de ligne. Je pense que ceci devrait être assez triviale à faire avec perl / awk (mais je ne les connais pas assez)

Tu peux aussi le faire avec ce genre d'horreur :

Code : Tout sélectionner

sed -e ':a' -e 'N' -e '$!ba' -r -e 's|([^\n ]) *\n *([^\n ])|\1 \2|g'
Ou plus compacte

Code : Tout sélectionner

sed -r ':a;N;$!ba;s|([^\n ]) *\n *([^\n ])|\1 \2|g'

Re: [sh] cherche commande pour afficher le contenu d'un fichier avec CPL fixe (résolu)

Publié : ven. 29 janv. 2016, 17:45
par bobo
Voici mon script pour reformater mes fichiers texte d'aide :
https://git.framasoft.org/bobo/dwm-cust ... eformat.sh

Dans la fonction reformat() on trouve une série de 7 one-liners perl

Re: [sh] cherche commande pour afficher le contenu d'un fichier avec CPL fixe (résolu)

Publié : ven. 29 janv. 2016, 18:39
par benjarobin
Ceci est inutile | cat > ... ceci peut être remplacé par > ...
Le fichier temporaire ne devrait pas être hardcodé, mais tu devrait utiliser la fonction mktemp

Re: [sh] cherche commande pour afficher le contenu d'un fichier avec CPL fixe (résolu)

Publié : ven. 29 janv. 2016, 20:27
par bobo
benjarobin a écrit :Ceci est inutile | cat > ... ceci peut être remplacé par > ...
J'ignore ce flag de shellcheck pour conserver un format identique pour toutes les modifs' avec un pipe à la fin. Il est alors facile de commenter une ligne pour du debug.
benjarobin a écrit :Le fichier temporaire ne devrait pas être hardcodé, mais tu devrais utiliser la fonction mktemp
Ah, il faut que je regarde ça. Merci pour la piste. J'ai reçu un mail salé d'un mec de Suckless qui avait regardé le code de ma version 0.1 de dwm-custom. À ma réponse il m'a orienté sur quelques ressources (shellcheck, checkbashisms, http://pubs.opengroup.org/onlinepubs/96 ... #tag_18_10). Ça m'a bien aidé, mais il y a encore de la marge de progression ;)