#1 Le 05/12/2021, à 16:16
- guigui_86
[Résolu]Remplacer une chaine dans plusieurs fichiers de même extension
Bonjour à tous,
Question classique je crois, mais je n'ai pas encore trouvé de réponse qui fonctionne correctement pour moi.
J'ai un dossier qui contient des sous-dossiers, qui contiennent eux-mêmes beaucoup de fichiers qui ont toutes la même extension .tex.
Dans tous ces fichiers .tex, et pas dans d'autres, je voudrais remplacer une chaîne de caractère par une autre.
Merci d'avance si vous pouvez m'aider.
Dernière modification par guigui_86 (Le 05/12/2021, à 19:16)
Hors ligne
#2 Le 05/12/2021, à 16:46
- geole
Re : [Résolu]Remplacer une chaine dans plusieurs fichiers de même extension
Bonjour
Cette discussion pourrait te faire avancer https://forum.ubuntu-fr.org/viewtopic.php?id=2068562
ou celle-ci https://forum.ubuntu-fr.org/viewtopic.php?id=1815931
Dernière modification par geole (Le 05/12/2021, à 17:01)
Hors ligne
#3 Le 05/12/2021, à 16:50
- MicP
Re : [Résolu]Remplacer une chaine dans plusieurs fichiers de même extension
Bonjour
Si le chemin absolu du "dossier" (je préfère appeler ça un répertoire) est $HOME/essais
et si le texte à remplacer est texte à remplacer
et si le texte de remplacement est texte remplacé
find $HOME/essais -type f -name "*.tex" -execdir sed -i 's/texte à remplacer/texte remplacé/' {} \;michel@debbull:~$ grep -R "texte à remplacer" $HOME/essais/rep1
/home/michel/essais/rep1/ssRep2/fich 2.tex:texte à remplacer dans la phrase
/home/michel/essais/rep1/ssRep2/ssRep3/fich 3b.tex:texte à remplacer dans la phrase
/home/michel/essais/rep1/ssRep2/ssRep3/fich 3a.tex:texte à remplacer dans la phrase
/home/michel/essais/rep1/ssRep2/ssRep3/fich 3.tex:texte à remplacer dans la phrase
/home/michel/essais/rep1/fich_1.tex:texte à remplacer dans la phrase
michel@debbull:~$
michel@debbull:~$ find $HOME/essais -type f -name "*.tex" -execdir sed -i 's/texte à remplacer/texte remplacé/' {} \;
michel@debbull:~$
michel@debbull:~$ grep -R "texte à remplacer" $HOME/essais/rep1
michel@debbull:~$
michel@debbull:~$ grep -R "texte remplacé" $HOME/essais/rep1
/home/michel/essais/rep1/ssRep2/fich 2.tex:texte remplacé dans la phrase
/home/michel/essais/rep1/ssRep2/ssRep3/fich 3b.tex:texte remplacé dans la phrase
/home/michel/essais/rep1/ssRep2/ssRep3/fich 3a.tex:texte remplacé dans la phrase
/home/michel/essais/rep1/ssRep2/ssRep3/fich 3.tex:texte remplacé dans la phrase
/home/michel/essais/rep1/fich_1.tex:texte remplacé dans la phrase
michel@debbull:~$ NOTE :
Avec la commande exec la commande sed sera lancée pour chacun des fichiers trouvés <=> une commande sed lancée pour chaque fichier trouvé,
alors qu'avec la commande execdir il n'y aura qu'une une seule commande sed qui sera lancée pour tous les fichiers trouvés dans le même répertoire <=> une seule commande sed lancée par répertoire.
et une commande sed peut être appliquée sur une série de fichiers,
comme par exemple :
sed -i 's/texte à remplacer/texte remplacé/' fichier_1.tex fichier_2.tex "autre Fichier.tex" "et un de plus.tex"Dernière modification par MicP (Le 05/12/2021, à 17:25)
Hors ligne
#4 Le 05/12/2021, à 18:06
- guigui_86
Re : [Résolu]Remplacer une chaine dans plusieurs fichiers de même extension
Merci MicP, ça a l'air de très bien convenir.
Seulement dans le texte à remplacer, et dans le texte remplacé, j'ai des caractères /. Précisément je dois remplacer "/home/dossier/latex" par "/home/dossier/plus/latex"
Par conséquent sed ne comprend plus rien quand j'écris :
sed -i 's/home/dossier/latex/home/dossier/plus/latex/' Un moyen pour distinguer le / syntaxique de sed du / de la chaîne à remplacer ?
Hors ligne
#5 Le 05/12/2021, à 18:20
- MicP
Re : [Résolu]Remplacer une chaine dans plusieurs fichiers de même extension
Dans la commande sed
on pourrait échapper les caractères / qui sont dans le motif à remplacer et dans la chaîne de remplacement :
motif à remplacer deviendrait :
\/home\/dossier\/latexet chaîne de remplacement deviendrait :
\/home\/dossier\/plus\/latexce qui donnerait :
sed -i 's/\/home\/dossier\/latex/\/home\/dossier\/plus\/latex/' …mais c'est plus simple (et plus facile à lire)
en utilisant seulement une fonctionnalité de sed qui permet d'utiliser un autre caractère que / (par exemple #) comme caractère délimiteur de motifs :
sed -i 's#/home/dossier/latex#/home/dossier/plus/latex#' Dernière modification par MicP (Le 05/12/2021, à 21:56)
Hors ligne
#6 Le 05/12/2021, à 19:16
- guigui_86
Re : [Résolu]Remplacer une chaine dans plusieurs fichiers de même extension
Parfait, merci.
Jamais déçu par la qualité et la convivialité de ce forum ![]()
Hors ligne