Forum Programmation.shell Astuce pour faire une substitution sur une chaine et pas les autres la comprenant ? RESOLU

Posté par  .
Étiquettes :
0
16
nov.
2011

Bonjour à tous,

Je vous explique mon problème qui semble relativement simple mais je n'arrive pas à avoir le bon raisonnement pour le résoudre (je suis scripteur débutant) :

J'ai 2 fichiers :

Un fichier de référence contenant des valeurs et leur correspondance. Exemple corresp :

toto1 fred
...
toto11 lucas
...

Un second fichier dans lequel je dois remplacer les valeurs. Exemple prenoms:
toto1 toto11
...
toto11 toto1
...

Or quand je fais ma commande sed de remplacement :

while read corresp
do
code=echo $corresp | cut -d ' ' -f1
prenom=echo $corresp | cut -d ' ' -f2
echo $code,$prenom
sed -i "s/$code/$prenom/g" prenoms
done < corresp

J'obtiens ceci :

fred fred1
...
fred1 fred
...

Alors que je souhaiterai ceci :

fred lucas
...
lucas fred
...

Pouvez-vous m'aider a trouver le bon raisonnement s.v.p. ?

N.B. : J'ai bien essayé de gérer le problème en ajoutant un espace dans ma variable mais ça ne marche que pour la première colonne et par pour la seconde puisqu'il n'y a pas d'espace a la fin des lignes du fichier corresp... donc mauvais raisonnement...

  • # Mot

    Posté par  (site web personnel) . Évalué à 2.

    Ce que tu veux remplacer, ce n'est pas « toto1 » par « fred » mais « toto1 » par « fred ». En sed -r (regex étendues), ça va donner quelque chose comme :

    s/toto1( |$)/fred\1/g
    
    

    La référence arrière est là pour replacer l'espace, si c'en était un. Je te laisse recoller les bouts, sachant que l'utilisation d'une boucle du shell et d'un sed à chaque fois est assez horrible et pourrait avantageusement être remplacée par un unique appel à sed, qui peut tout à fait prendre plusieurs commandes d'un coup.

    • [^] # Re: Mot

      Posté par  . Évalué à 2.

      ce n'est pas « toto1 » par « fred » mais « toto1 » par « fred »

      Je suis nul en sed (en awk aussi d'ailleurs) et je suis bien incapable d'aider l'auteur du post (en tous cas pas facilement, sans réfléchir pendant quelques heures...) Mais là je crois que tu as fait une typo dans ton commentaire, non ?

    • [^] # Re: Mot

      Posté par  (site web personnel, Mastodon) . Évalué à 1.

      s/$code( |$)/$prenom\1/g
      Il faudra peut-être échapper un caractère ou deux...

      En gros ça veut dire, je remplace $code suivi d'un espace OU $code suivi d'une fin de ligne par : $prenom suivi du caractère qui était présent avant

      • [^] # Re: Mot

        Posté par  . Évalué à -2.

        Bonjour et merci mais je vais utiliser la solution de netsurfeur qui est plus simple.

  • # Mot entier

    Posté par  . Évalué à 4.

    Il suffit de demander à sed de se limiter à des mots entiers:

    while read code prenom
    do
       echo $code $prenom
       sed -i "s/\<$code\>/$prenom/g" prenoms
    done < corresp 
    
    

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.