Remplacer des lignes numérotées

Résolu
helvetdulac1939 Messages postés 2 Date d'inscription   Statut Membre Dernière intervention   -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -

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

1 réponse

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     

    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