[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Re : Re: sed ignorer une occurence



Bonjour,

J'ai fait un peu de révision sur les regex hier, justement.

Les backreferences servent à exprimer un occurrence de texte identique à une autre occurence précédente, capturée par des parenthèses. 

Par exemple, dans un texte contenant des chaînes délimitées soit par des doubles quotes ou des simples quotes (le HTML apr exemple) alors tu peux capturer le début d'une chaîne avec ("|') puis trouver la fin de cette chaîne avec \1. En supposant que l'ouverture de la chaîne soit la 1ere paire de parenthèses de ta regex.

Dans ton cas tu veux que ta regex ne corresponde PAS à un masque suivi d'un point puis un retour à la ligne (de ce que j'ai compris). Ce point et retour a la ligne le doivent pas être dans la chaîne matchée. Il te faut donc un look around. Tu peux le faire avec (?!\.\n) .

Essaye et dis si ça fonctionne.

Tu as aussi des outils sympas pour tester tes regexes,


https://regex101.com/

Et une excellente documentation sur les regexes, celle qui m'a permis de tout en apprendre il y a bien longtemps. Pour moi c'est une référence dans le domaine.

https://www.regular-expressions.info/

Jette un oeil aux lookarounds, c'est abondament expliqué. 





Le sam. 3 juin 2023 à 13:46, benoit <benoitlst@protonmail.ch> a écrit :
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: