#1 Le 05/12/2021, à 16:16
- guigui_86
[Résolu x3]Remplacer chaine/bloc de caractères dans plusieurs fichiers
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.
Réouvert pour remplacement de blocs de caractères.
Merci d'avance si vous pouvez m'aider.
Dernière modification par guigui_86 (Le 04/07/2023, à 22:33)
Hors ligne
#2 Le 05/12/2021, à 16:46
- geole
Re : [Résolu x3]Remplacer chaine/bloc de caractères dans plusieurs fichiers
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)
Les grilles de l'installateur https://doc.ubuntu-fr.org/tutoriel/inst … _subiquity
"gedit admin:///etc/fstab" est proscrit, utilisez "pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY xdg-open /etc/fstab" Voir https://doc.ubuntu-fr.org/gedit
Les partitions EXT4 des disques externes => https://forum.ubuntu-fr.org/viewtopic.p … #p22697248
En ligne
#3 Le 05/12/2021, à 16:50
- MicP
Re : [Résolu x3]Remplacer chaine/bloc de caractères dans plusieurs fichiers
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.
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 28/05/2022, à 16:27)
Hors ligne
#4 Le 05/12/2021, à 18:06
- guigui_86
Re : [Résolu x3]Remplacer chaine/bloc de caractères dans plusieurs fichiers
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 x3]Remplacer chaine/bloc de caractères dans plusieurs fichiers
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 la fonctionnalité de sed permettant 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 28/05/2022, à 16:34)
Hors ligne
#6 Le 05/12/2021, à 19:16
- guigui_86
Re : [Résolu x3]Remplacer chaine/bloc de caractères dans plusieurs fichiers
Parfait, merci.
Jamais déçu par la qualité et la convivialité de ce forum
Hors ligne
#7 Le 27/05/2022, à 23:01
- guigui_86
Re : [Résolu x3]Remplacer chaine/bloc de caractères dans plusieurs fichiers
Hop je remonte le sujet car nouvelle question à la suite de l'ancienne.
Maintenant je dois remplacer une chaîne dans laquelle il y a des accents, par une autre chaîne dans laquelle il y aussi des accents. Par exemple remplacer "éléphant" par "à l'école", les résultats que j'obtiens me font soupçonner un problème d'encodage des caractères accentués, exemples :
find $HOME/essais -type f -name "*.tex" -execdir sed -i "s#éléphant#à l'école#" {} \;
Rien ne fonctionne.
find $HOME/essais -type f -name "*.tex" -execdir sed -i "s#elephant#à l'école#" {} \;
Les elephant sont bien remplacés, mais les caractères accentués des nouveaux à l'école sont bizarres.
find $HOME/essais -type f -name "*.tex" -execdir sed -i "s#éléphant#a l'ecole#" {} \;
Les éléphant ne sont pas remplacés.
find $HOME/essais -type f -name "*.tex" -execdir sed -i "s#elephant#a l'ecole#" {} \;
Tout marche bien
Une idée pour contourner le problème ? Mes fichiers originaux sont encodés en Western Europe ISO 8859-15, il ne faut pas changer cela car ça a tendance à créer des conflits avec d'autres bazars que je ne veux pas toucher.
Hors ligne
#8 Le 28/05/2022, à 01:12
- MicP
Re : [Résolu x3]Remplacer chaine/bloc de caractères dans plusieurs fichiers
Bonjour
Tu pourrais convertir le motif de recherche et la chaîne de remplacement en ISO-8859-15 puis en une suite de caractères hexadécimaux
afin d'utiliser ces suites de caractères hexadécimaux dans la commande sed :
D'abord, il faut convertir le motif de recherche éléphant en ISO-8859-15 puis en une suite de caractères hexadécimaux (formatée pour sed <=> précédés de \x) :
michel@debbull:~$ printf "éléphant" | iconv --from-code=UTF-8 --to-code=ISO-8859-15 - | od -An -tx1 | sed 's/ /\\x/g'
\xe9\x6c\xe9\x70\x68\x61\x6e\x74
michel@debbull:~$
Ensuite, il faut convertir la chaîne de caractères à l'école en ISO-8859-15 puis en une suite de caractères hexadécimaux (formatée pour sed <=> précédés de \x) :
michel@debbull:~$ printf "à l'école" | iconv --from-code=UTF-8 --to-code=ISO-8859-15 - | od -An -tx1 | sed 's/ /\\x/g'
\xe0\x20\x6c\x27\xe9\x63\x6f\x6c\x65
michel@debbull:~$
et on peut maintenant utiliser ces deux suites dans la commande sed à appliquer au fichier qui est encodé en ISO-8859-15 :
sed -i "s#\xe9\x6c\xe9\x70\x68\x61\x6e\x74#\xe0\x20\x6c\x27\xe9\x63\x6f\x6c\x65#g" $HOME/essais/nomDuFichierISO-8859-15.tex
NOTE :
J'ai ajouté le caractère g (<=> global substitution) dans la commande sed
afin que tous les éléphants (s'il y en a plusieurs dans la même ligne) soient pris en compte,
sinon, dans chaque ligne du fichier à traiter, il n'y aurait que la première occurrence du motif recherché qui serait remplacée.
=======
Donc, pour remplacer éléphant par à l'école dans tous les fichiers .tex qui sont encodés en ISO-8859-15
et qui sont contenus dans toute l'arborescence du répertoire $HOME/essais/
on peut lancer la ligne de commandes suivante :
find $HOME/essais -type f -name "*.tex" -execdir sed -i "s#\xe9\x6c\xe9\x70\x68\x61\x6e\x74#\xe0\x20\x6c\x27\xe9\x63\x6f\x6c\x65#g" {} \;
Dernière modification par MicP (Le 28/05/2022, à 16:31)
Hors ligne
#9 Le 28/05/2022, à 01:17
- guigui_86
Re : [Résolu x3]Remplacer chaine/bloc de caractères dans plusieurs fichiers
Bon sang ça fait peur ! Et je te remercie de prendre tout ce temps pour résoudre mes petits problèmes.
Je vais essayer et te tiens au courant des résultats.
Hors ligne
#10 Le 28/05/2022, à 01:48
- MicP
Re : [Résolu x3]Remplacer chaine/bloc de caractères dans plusieurs fichiers
J'ai pensé qu'il valait mieux convertir en ISO-8859-15 seulement le motif de recherche et la chaîne de remplacement
plutôt que devoir convertir tous les fichiers ISO-8859-15 en UTF-8, puis lancer le find + sed, pour finir par les convertir à nouveau en ISO-8859-15
Il y a sur ce forum des personnes extrêmement plus compétentes que moi
qui viendront peut-être proposer une solution plus simple et efficace.
Dernière modification par MicP (Le 28/05/2022, à 08:25)
Hors ligne
#11 Le 28/05/2022, à 01:51
- guigui_86
Re : [Résolu x3]Remplacer chaine/bloc de caractères dans plusieurs fichiers
En tous cas ça fonctionne parfaitement comme ça. Comme je ne dois faire le remplacement qu'une fois, ce n'est pas compliqué de faire les deux conversions partielles.
Merci encore pour ton aide, toujours content de la qualité et de la convivialité de ce forum.
Hors ligne
#12 Le 28/05/2022, à 01:57
- MicP
Re : [Résolu x3]Remplacer chaine/bloc de caractères dans plusieurs fichiers
Très content d'avoir pu t'aider
Hors ligne
#13 Le 04/07/2023, à 12:06
- guigui_86
Re : [Résolu x3]Remplacer chaine/bloc de caractères dans plusieurs fichiers
Je réouvre le sujet car nouvelle problématique.
Toujours dans plusieurs fichiers d'extension .tex d'un même répertoire, je dois remplacer une chaîne de caractère par une autre. La nouveauté est que cette chaîne s'étend sur plusieurs lignes. Précisément, je dois remplacer le bloc :
\setcounter{page}{1}
\large{
par le bloc :
\setcounter{page}{2}
\large
Je ne sais pas comment gérer le changement de ligne dans les commandes du type suivant :
find $HOME/repertoire -type f -name "*.tex" -execdir sed -i 's#ancien_texte#nouveau_texte#'
Toute aide sera la bienvenue.
Hors ligne
#14 Le 04/07/2023, à 12:22
- MicP
Re : [Résolu x3]Remplacer chaine/bloc de caractères dans plusieurs fichiers
Bonjour
Essaye avec :
find $HOME/repertoire -type f -name "*.tex" -execdir sed -zi 's#\(\\setcounter{page}{\)1\(}\n\\large\){#\12\2#'
EDIT : Rhâaaa! j'avais oublié l'option i
Dernière modification par MicP (Le 05/07/2023, à 01:02)
Hors ligne
#15 Le 04/07/2023, à 13:56
- guigui_86
Re : [Résolu x3]Remplacer chaine/bloc de caractères dans plusieurs fichiers
Merci pour la proposition. J'essaie de comprendre la syntaxe dans le sed :
* il faut doubler les \, sûrement une question d'échappement de la syntaxe de sed
* on entoure les chaînes à ne pas remplacer par \(à_ne_pas_remplacer\)
*\n correspond au changement de ligne
Mais je ne comprends pas la syntaxe \12\2 dans la partie nouveau_texte ?
Hors ligne
#16 Le 04/07/2023, à 16:27
- MicP
Re : [Résolu x3]Remplacer chaine/bloc de caractères dans plusieurs fichiers
Pour le voir plus facilement, au lieu d'utiliser / :
sed 's/motif/replace/"
j'ai utilisé # :
sed 's#motif#replace#"
=======
\setcounter{page}{1} \large{
par le bloc :
\setcounter{page}{2} \large
Donc, dans la première ligne, le chiffre 1 doit être changé en 2
et le caractère { final de la deuxième ligne doit disparaître.
Le caractère \ qui est deux fois dans le motif de recherche devra être "échappé".
L'ouverture et fermeture des parenthèses seront aussi "échappées"
\1 <=> ce qui est dans la première paire de parenthèses
\2 <=> ce qui est dans la deuxième paire de parenthèses (retour à la ligne compris)
sed -zi 's#\(\\setcounter{page}{\)1\(}\n\\large\){#\12\2#'
=======
il y a des personnes bien plus compétentes que moi qui pourraient proposer quelque chose de plus efficace.
Dernière modification par MicP (Le 04/07/2023, à 16:42)
Hors ligne
#17 Le 04/07/2023, à 22:32
- guigui_86
Re : [Résolu x3]Remplacer chaine/bloc de caractères dans plusieurs fichiers
Après tests, ça fonctionne correctement. Encore une victoire de MicP, merci
Hors ligne
#18 Le 04/07/2023, à 22:55
- iznobe
Re : [Résolu x3]Remplacer chaine/bloc de caractères dans plusieurs fichiers
Bonsoir , juste pour faire raler @MicP au passage ( je suis bien incapable d ' ecrire ce genre de commande )
L'ouverture et fermeture des parenthèses seront aussi "échappées"
il n' y aucune parenthese dans le motif de recherche : " { , } " ce sont des accolades ouvrantes et fermantes
Dernière modification par iznobe (Le 04/07/2023, à 22:56)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#19 Le 05/07/2023, à 01:20
- MicP
Re : [Résolu x3]Remplacer chaine/bloc de caractères dans plusieurs fichiers
Ça a marché J'ai effectivement commencé par râler,
… puis j'ai relu ton message, mais cette fois depuis la première ligne
Dernière modification par MicP (Le 05/07/2023, à 01:20)
Hors ligne