Contenu | Rechercher | Menus

Annonce

DVD, clés USB et t-shirts Ubuntu-fr disponibles sur la boutique En Vente Libre

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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)

En 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)


Retour utilisable de commande
2.d  Le prompt final : - permet de s'assurer que la commande est allée à son terme,- permet de s'assurer que la réponse du système n'est pas coupée à la fin,- et fournit parfois d'autres informations, détaillées au message #42

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\/latex

et chaîne de remplacement deviendrait :

\/home\/dossier\/plus\/latex

ce 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)


Retour utilisable de commande
2.d  Le prompt final : - permet de s'assurer que la commande est allée à son terme,- permet de s'assurer que la réponse du système n'est pas coupée à la fin,- et fournit parfois d'autres informations, détaillées au message #42

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 smile

Hors ligne