Bash : remplacer des chaines par d'autres ans un fichier
Résolu
mortelrdv
-
mortelrdv -
mortelrdv -
A voir également:
- Bash remplacer un caractère par un autre
- Caractère ascii - Guide
- Remplacer disque dur par ssd - Guide
- Caractère spéciaux - Guide
- Remplacer un mot par un autre word - Guide
- Caractères spéciaux : comment les saisir facilement - Guide
5 réponses
Déjà pour les remplacements de sed j'ajouterais un "/g" à la fin pour que toutes les occurrences d'un motif dans un ligne soient substituées. Ensuite la manière de rendre tout ça efficace, c'est d'enchaîner les sed à la volée (-e) via des pipes (|) au lieu de faire la modifications dans le fichier lui même (-i) :
Bonne chance
(mando@silk) (~) $ cat toto.txt aaa;bbbb ddd;zzz hhh;kkk (mando@silk) (~) $ sed -e "s/bbbb/aaa/g" toto.txt | sed -e "s/ddd/zzz/g" | sed -e "s/hhh/kkk/g" > tata.txt (mando@silk) (~) $ cat tata.txt aaa;aaa zzz;zzz kkk;kkk
Bonne chance
Salut,
$ head fich* ==> fichA <== aaa;bbbbb ddd;zzz hhh;kkk ==> fichB <== aaa -----> bbbbb ddd -----> zzz hhh -----> kkk $ OIFS="${IFS}";IFS=";" while read cA cB do sed -i "s/${cA}/${cB}/g" fichB done < fichA IFS="${OIFS}" $ head fich* ==> fichA <== aaa;bbbbb ddd;zzz hhh;kkk ==> fichB <== bbbbb -----> bbbbb zzz -----> zzz kkk -----> kkk $
Ah tiens, je viens de faire un essai assez concluant ma foi ;-))
Plutôt que de s'embêter avec la variable ${IFS}, j'ai carrément pris la ligne dans sa totalité, mais par contre j'ai changé le séparateur par défaut de "sed", qui est le slash pour rappel, par celui contenu dans le fichA, à savoir le point virgule (;), et ça marche ;-))
Enjoy ;-))
Plutôt que de s'embêter avec la variable ${IFS}, j'ai carrément pris la ligne dans sa totalité, mais par contre j'ai changé le séparateur par défaut de "sed", qui est le slash pour rappel, par celui contenu dans le fichA, à savoir le point virgule (;), et ça marche ;-))
$ while read line;do sed -i.bak "s;${line};g" fichB;done < fichA $ cat fichB bbbbb -----> bbbbb zzz -----> zzz kkk -----> kkk $
Enjoy ;-))
J'avais mal lu lors de ma première réponse, ci-dessous un script shell qui répond à la remarque :
https://forums.commentcamarche.net/forum/oldest/26751996-bash-remplacer-des-chaines-par-d-autres-ans-un-fichier#2
... avec le fichier subst.txt qui contient :
... et toto.txt le fichier sur lequel on se base pour générer le fichier titi.txt.
Ceci dit, la solution https://forums.commentcamarche.net/forum/oldest/26751996-bash-remplacer-des-chaines-par-d-autres-ans-un-fichier#6 est plus concise :-)
Bonne chance
https://forums.commentcamarche.net/forum/oldest/26751996-bash-remplacer-des-chaines-par-d-autres-ans-un-fichier#2
#!/bin/bash conf="subst.txt" in="toto.txt" out="titi.txt" cmd="cat $in" while read line do a="$(echo $line | cut -d';' -f1)" b="$(echo $line | cut -d';' -f2)" cmd="$cmd | sed -e \"s/$a/$b/g\"" done < $conf cmd="$cmd > $out" eval $cmd
... avec le fichier subst.txt qui contient :
aaa;bbbbb ddd;zzz hhh;kkk
... et toto.txt le fichier sur lequel on se base pour générer le fichier titi.txt.
Ceci dit, la solution https://forums.commentcamarche.net/forum/oldest/26751996-bash-remplacer-des-chaines-par-d-autres-ans-un-fichier#6 est plus concise :-)
Bonne chance
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
mais dans le cas où le fichierA contient plein de possibilité de remplacement, mettre tout ça sur une ligne de commande c'est invivable.
de plus je me vois mal de faire des lignes de sed de cette longueur à chaque fois que le contenu du fichierA change (on n'en finira plus avec les copier/coller :) )