#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
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