Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 28/03/2019, à 13:22

DonutMan75

[VIM] Ou logique dans une regexp ? [RESOLU]

(re)bonjour à tous,
je travaille sur un fichier latex qui contient plein de figures avec des étiquettes. Mon fichier ressemble un peu à ça :

\begin{figure}
\includegraphics[width=\linewidth]{./mafigure.png}
\caption{ma jolie figure}
\label{fig:mafigure}
\end{figure}

Comme l'illustre ma jolie figure \ref{fig:mafigure}, on voit que blablabla

Je souhaite rajouter un "bis" à la fin de toutes mes étiquettes pour qu'au final mon texte ressemble à ça :

\begin{figure}
\includegraphics[width=\linewidth]{./mafigure.png}
\caption{ma jolie figure}
\label{fig:mafigurebis}
\end{figure}

Comme l'illustre ma jolie figure \ref{fig:mafigurebis}, on voit que blablabla

Bien sûr, comme je suis une grosse feignasse, je veux automatiser ça un maximum avec vi.

J'arrive à faire ça en deux étapes (commandes ex, donc qui commencent avec ":")

:%s/\(\\ref{[^}]*\)}/\1bis}/g
:%s/\(\\label{[^}]*\)}/\1bis}/g

Décortication :

  • % : on travaille sur l'ensemble du fichier

  • s : on fait une substitution

  • \( et \) : on capture la regexp dans la variable \1

  • \\ref : littéralement la chaîne "\ref{"

  • [^}]* : n'importe quelle suite de caractères qui ne contient pas l'accolade fermante "}"

  • } : notre accolade fermante

  • /\1bis/ : on ajoute "bis" au truc capturé. Dans mon exemple "\ref{fig:mafigure" deviendra donc "\ref{fig:mafigurebis"

  • g : on veut un remplacement global (et ne pas seulement s'arrêter à la première occurence)

Ma question : peut-on faire le remplacement en UNE SEULE ETAPE ?
Autrement dit, j'aimerais capturer "\ref{" OU "\label{"
Je sais qu'avec les regexp étendue de sed on peut s'en sortir avec un truc du genre "(toto|titi)"
Mais ça ne semble pas marcher ici... Je bloque notamment sur l'utilisation des parenthèses pour capturer la portée du OU logique

Vous avez des idées ??

Merci d'avance smile

Donut

Dernière modification par DonutMan75 (Le 28/03/2019, à 15:04)

Hors ligne

#2 Le 28/03/2019, à 13:46

Watael

Re : [VIM] Ou logique dans une regexp ? [RESOLU]

salut,

%s/\(\\\(label\|ref\){[^}]*\)}/\1bis}/g 

non?


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#3 Le 28/03/2019, à 15:04

DonutMan75

Re : [VIM] Ou logique dans une regexp ? [RESOLU]

Hello Watael !
Ca marche nickel, merci beaucoup !
J'avais du penser à échapper le ( mais pas le |, du coup ça ne marchait pas....
A garder dans un coin de la tête : ( ) servent identiquement à définir la portée d'une opération logique et à capturer du texte.
Enfin bref, je passe à résolu

Bonne aprem

Hors ligne