Remplacer des lignes numérotées
RésoluBonjour,
Je voudrais remplacer dans un texte les débuts de ligne numérotés:
Exemple :
2. Terminologie commune
devient :
(2) Terminologie commune
J'essaye depuis pas mal de temps et j'utilise :
- rechercher (caractère générique / caractère quelconque) :
(\\d)(.+?)
- remplacer par :
(\()(\\d)(\))(.+?)( )
Je n'arrive à rien : mes phrases sont reconnues, mais rien ne se produit lors de la recherche.
Je n'arrive qu'avec des demandes simples (changement de couleur ou de police)
Merci d'avance de vos avis
1 réponse
-
Bonjour,
Je ne sais pas quel outil tu utilises, mais ce qui est sûr, c'est que grep que tu évoques ne fait pas de substitution, juste de la recherche. Ce n'est donc pas l'outil adéquat, il faudrait plutôt utiliser sed.
Du coup, voici comment procéder avec sed (et le comportement devrait être à peu près similaire avec ton outil.
Sur une chaîne de caractère
Comme écrire du premier coup une expression sed n'est jamais évident, l'idée est d'y injecter une chaîne pertinente avec echo et un pipe de progressivement construire l'expression sed (par exemple, d'abord substituer un chiffre, puis un nombre, puis attaquer le problème des points et des parenthèses). Après quelques essais, on arrive à cette expression :
echo "2. Terminologie commune" | sed -e 's/\([0-9][0-9]*\)[.]/(\1)/g'
(2) Terminologie communeOn peut ensuite complexifier un peu l'exemple pour avoir un nombre plutôt qu'un chiffre isoler et s'assurer que ça continue à marcher.
echo "13. Terminologie" | sed -e 's/\([0-9][0-9]*\)[.]/(\1)/g'
(13) TerminologieSur un fichier
On peut appliquer sed sur chacune des lignes d'un fichier. Mettons que fichier.txt contienne :
2. Terminologie commune plop 13. Terminologie pouet 14. plop 15. pouetalors :
sed -e 's/\([0-9][0-9]*\)[.]/(\1)/g' fichier.txt
(2) Terminologie commune plop (13) Terminologie pouet (14) plop (15) pouetSi la modification sur ce fichier te convient, remplace -e par -i.
sed -i 's/\([0-9][0-9]*\)[.]/(\1)/g' fichier.txt
Quelques explications
Syntaxe
Avec sed, une substitution s'écrit sous la forme
s/motif/remplacement/optionsou
s%motif%remplacement%optionsIci j'ai utilisé la première syntaxe. Voyons la signification de chacun de ces paramètres :
motif : \([0-9][0-9]*\)[.]
- Un chiffre (caractère compris entre 0 et 9) ne peut pas être écrit à l'aide de \d (ça n'existe pas), on écrit donc [0-9] au lieu de \d.
- L'opérateur + (au moins une répétition) n'existe pas, donc au lieu d'écrire [0-9]+ on écrit [0-9][0-9]* (car * signifie entre 0 et un nombre arbitraire de répétitions).
- Dans la première partie de sed, l'opérateur \( ... \) sert à capturer un tronçon de chaîne (en l'occurrence, le nombre entier que l'on veut remplacer). Comme il s'agit du premier (et seul) tronçon capturé, il est désigné dans le second membre de sed par \1.
- Pour désigner le caractère "." et non un caractère quelconque, il faut veiller à écrire soit \. soit [.].
remplacement : (\1)
- ici, on écrit simplement comment remplacer le motif (soit le nombre entier et le "." qui suit) : en l'occurrence, on écrit (\1) pour dire qu'on écrit "(", puis le tronçon capturé (donc le nombre entier), puis ")".
options : g
- Cette option signifie que si plusieurs occurrences du motif cherché apparaisse sur une même ligne, toutes doivent être substituées. Sans cette option, seule la première occurrence serait corrigée (ce qui est peut-être suffisant dans ton cas). Dans l'exemple avec un fichier, c'est grâce à cette option que "15." est bien substitué en "(15)".
Bonne chance