Re : Re: sed ignorer une occurence
Le vendredi 2 juin 2023 à 18:05, Marc Chantreux <mc@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
Reply to: