Le vendredi 2 juin 2023 à 18:05, Marc Chantreux <m...@unistra.fr> a écrit :
> salut, > > > % sed -rz '{s/-\n//g;s/\n//g}' format.txt > > > <<\% sed -rz 's/-\n//g; s/([^.\n])\n/\1/g' | tr -s ' ' | fmt -w72 > > Je suis pas sur d'avoir compris le pb. > > Je voudrais reformater du texte en colonne, > qui a été just- > ifié avec des retours à la ligne (\n) et > est - de coupure de mot. > > % > > Si la commande correspond bien à ton besoin, tu peux directement > l'utiliser dans vi grace à un range. > J'utilise plutôt emacs et ne connais pas bien vi autrement que pour éditer des fichiers de config. > si tu as fais une selection visuelle, tappes > > !sed -rz 's/-\n//g; s/([^.\n])\n/\1/g' | tr -s ' ' | fmt -w72 > > les prochains usages de ! rappellent le dernier filtre, tu n'auras > plus qu'a taper !! au lieu de ! et rappeler la commande. > > Évidement ça marche avec tous les ranges :) > > astuce: mettre le filtre dans un fichier à part pour en faciliter la > maintenance: > > :sp monfiltre > :!chmod a+x % > > et ensuite tu peux écrire ton filtre en espaçant un peu et en commentant > > #!/bin/sh > # note1: je ne vire le retour à la ligne que si il est précédé > # d'autre chose qu'un espace d'autre chose qu'un point "." tu veux dire ? Oui c'est bien ma demande virer tous les retour à la ligne et ignorer([^.\n]) ceux qui sont précédés d'un point. Il me manquais deux notions : [^.\n] non match (la négation de la correspondance) \1 backreference dans l'expression régulière, là par contre il va falloir que je lise une bonne doc sur le sujet, G pas tout compris ! :-) > sed -rz ' > s/-\n//g > s/([^.\n])\n/\1/g # cf. note1 > ' | > tr -s ' ' | > fmt -w72 > > et finalement > > filtrer avec <monrange>!./monfiltre > > > je fais concis pour aller vite. n'hésite pas à me demander de plus > amples explications si cette piste de plait. > Un tout grand merci, je vais d’abord me documenter sur les backreferences ! Avec gratitude, Benoît