Remplacer des lignes numérotées
Résolu/Fermémamiemando Messages postés 33363 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 novembre 2024 - 25 oct. 2023 à 18:06
- Remplacer des lignes numérotées
- Remplacer disque dur par ssd - Guide
- Remplacer word - Guide
- Quel site pour remplacer coco - Accueil - Réseaux sociaux
- Excel trier par ordre alphabétique en gardant les lignes - Guide
- Remplacer tete sur photo - Guide
1 réponse
Modifié le 25 oct. 2023 à 18:20
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 commune
On 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) Terminologie
Sur 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. pouet
alors :
sed -e 's/\([0-9][0-9]*\)[.]/(\1)/g' fichier.txt
(2) Terminologie commune
plop
(13) Terminologie
pouet
(14) plop (15) pouet
Si 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/options
ou
s%motif%remplacement%options
Ici 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