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 <
[email protected]> a écrit :
Le vendredi 2 juin 2023 à 18:05, Marc Chantreux <[email protected]> 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
<div dir="auto"><div>Bonjour,<div dir="auto"><br></div><div dir="auto">J'ai fait un peu de révision sur les regex hier, justement.</div><div dir="auto"><br></div><div dir="auto">Les backreferences servent à exprimer un occurrence de texte identique
à une autre occurence précédente, capturée par des parenthèses. </div><div dir="auto"><br></div><div dir="auto">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.</div><div dir="auto"><br></div><div dir="
auto">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) .</div><div dir="auto"><br></div><div dir="auto">Essaye et dis si ça fonctionne.</div><div dir="auto"><br></div><div dir="auto">Tu as aussi des outils sympas pour tester tes regexes,</div><div dir="auto"><br></div><
div dir="auto"><br></div><div dir="auto"><a href="
https://regex101.com/" target="_blank" rel="noreferrer">
https://regex101.com/</a><br></div><div dir="auto"><br></div><div dir="auto">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.</div><div dir="auto"><br></div><div dir="auto"><a href="
https://www.regular-expressions.info/">https://www.regular-expressions.info/</a><br></div><div
dir="auto"><br></div><div dir="auto">Jette un oeil aux lookarounds, c'est abondament expliqué. </div><div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto"><br></div><br><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Le
sam. 3 juin 2023 à 13:46, benoit <<a href="mailto:
[email protected]" rel="noreferrer noreferrer" target="_blank">
[email protected]</a>> a écrit :<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc
solid;padding-left:1ex">Le vendredi 2 juin 2023 à 18:05, Marc Chantreux <<a href="mailto:
[email protected]" rel="noreferrer noreferrer noreferrer" target="_blank">
[email protected]</a>> a écrit :<br>
> salut,<br>
> <br>
> > % sed -rz '{s/-\n//g;s/\n//g}' format.txt<br>
> <br>
> <br>
> <<\% sed -rz 's/-\n//g; s/([^.\n])\n/\1/g' | tr -s ' ' | fmt -w72<br>
> <br>
> Je suis pas sur d'avoir compris le pb.<br>
> <br>
> Je voudrais reformater du texte en colonne,<br>
> qui a été just-<br>
> ifié avec des retours à la ligne (\n) et<br>
> est - de coupure de mot.<br>
> <br>
> %<br>
> <br>
> Si la commande correspond bien à ton besoin, tu peux directement<br>
> l'utiliser dans vi grace à un range.<br>
> <br>
J'utilise plutôt emacs et ne connais pas bien vi autrement que pour éditer des fichiers de config.<br>
> si tu as fais une selection visuelle, tappes<br>
> <br>
> !sed -rz 's/-\n//g; s/([^.\n])\n/\1/g' | tr -s ' ' | fmt -w72<br>
> <br>
> les prochains usages de ! rappellent le dernier filtre, tu n'auras<br> > plus qu'a taper !! au lieu de ! et rappeler la commande.<br>
> <br>
> Évidement ça marche avec tous les ranges :)<br>
> <br>
> astuce: mettre le filtre dans un fichier à part pour en faciliter la<br> > maintenance:<br>
> <br>
> :sp monfiltre<br>
> :!chmod a+x %<br>
> <br>
> et ensuite tu peux écrire ton filtre en espaçant un peu et en commentant<br>
> <br>
> #!/bin/sh<br>
> # note1: je ne vire le retour à la ligne que si il est précédé<br> > # d'autre chose qu'un espace<br>
d'autre chose qu'un point "." tu veux dire ?<br>
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.<br>
Il me manquais deux notions :<br>
[^.\n] non match (la négation de la correspondance) <br>
\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 ! :-)<br>
> sed -rz '<br>
> s/-\n//g<br>
> s/([^.\n])\n/\1/g # cf. note1<br>
> ' |<br>
> tr -s ' ' |<br>
> fmt -w72<br>
> <br>
> et finalement<br>
> <br>
> filtrer avec <monrange>!./monfiltre<br>
> <br>
> <br>
> je fais concis pour aller vite. n'hésite pas à me demander de plus<br>
> amples explications si cette piste de plait.<br>
> <br>
Un tout grand merci, je vais d’abord me documenter sur les backreferences !<br>
Avec gratitude,<br>
Benoît<br>
</blockquote></div></div></div>
--- SoupGate-Win32 v1.05
* Origin: fsxNet Usenet Gateway (21:1/5)