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 🚲 Tanguy Ortolo (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 :
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 Marotte ⛧ . Évalué à 2.
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 matthieu bollot (site web personnel, Mastodon) . Évalué à 1.
Je pense que c'est un ^ ou un $ perdu en route si il passe pas dans le commentaire, c'est que dlfp le mange...
[^] # Re: Mot
Posté par 🚲 Tanguy Ortolo (site web personnel) . Évalué à 2.
Ah, effectivement Markdown a mangé un bout de mon texte. C'était « toto1[fin de mot] »
[^] # Re: Mot
Posté par fredlabidouille . Évalué à 0.
Bonjour et merci mais je vais utiliser la solution de netsurfeur qui est plus simple.
[^] # Re: Mot
Posté par matthieu bollot (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 fredlabidouille . Évalué à -2.
Bonjour et merci mais je vais utiliser la solution de netsurfeur qui est plus simple.
# Mot entier
Posté par netsurfeur . Évalué à 4.
Il suffit de demander à sed de se limiter à des mots entiers:
[^] # Re: Mot entier
Posté par matthieu bollot (site web personnel, Mastodon) . Évalué à 1.
Merci je connaissais pas cette syntaxe :)
[^] # Re: Mot entier
Posté par fredlabidouille . Évalué à 1.
Ça fonctionne nickel ! Merci beaucoup !
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.