Remplacer des lignes numérotées

Résolu/Fermé
helvetdulac1939 Messages postés 2 Date d'inscription mercredi 7 juillet 2021 Statut Membre Dernière intervention 25 octobre 2023 - Modifié le 25 oct. 2023 à 18:21
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

Bonjour,

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

A voir également:

1 réponse

mamiemando Messages postés 33363 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 novembre 2024 7 801
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

0