Bash : remplacer des chaines par d'autres ans un fichier
Résolu/Fermé
A voir également:
- Bash remplacer un caractère par un autre
- Caractère ascii - Guide
- Word remplacer un mot par un autre - Guide
- Remplacer disque dur par ssd - Guide
- Caractere speciaux - Guide
- Caractères spéciaux : comment taper des |—[©\½→}… - Guide
5 réponses
mamiemando
Messages postés
33381
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
26 novembre 2024
7 802
Modifié par mamiemando le 26/12/2012 à 20:42
Modifié par mamiemando le 26/12/2012 à 20:42
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
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 418
26 déc. 2012 à 22:53
26 déc. 2012 à 22:53
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 $
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 418
26 déc. 2012 à 23:01
26 déc. 2012 à 23:01
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 ;-))
Utilisateur anonyme
Modifié par qqchquicommenceparQ le 26/12/2012 à 23:04
Modifié par qqchquicommenceparQ le 26/12/2012 à 23:04
salut,
sed "$(sed 's/^/s\//; s/;\|$/\//g' fichierA)g" fichierB
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 418
26 déc. 2012 à 23:06
26 déc. 2012 à 23:06
Aussi* ;-))
* Comme Félicie ;-)
* Comme Félicie ;-)
mamiemando
Messages postés
33381
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
26 novembre 2024
7 802
27 déc. 2012 à 01:10
27 déc. 2012 à 01:10
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
Modifié par mortelrdv le 26/12/2012 à 20:58
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 :) )