Contenu | Rechercher | Menus

Annonce

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, à 17: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, à 23:33)

Hors ligne

#2 Le 05/12/2021, à 17: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, à 18: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

Hors ligne

#3 Le 05/12/2021, à 17: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, à 17:27)

Hors ligne

#4 Le 05/12/2021, à 19: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, à 19: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, à 17:34)

Hors ligne

#6 Le 05/12/2021, à 20: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 smile

Hors ligne

#7 Le 28/05/2022, à 00: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, à 02: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, à 17:31)

Hors ligne

#9 Le 28/05/2022, à 02: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, à 02: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, à 09:25)

Hors ligne

#11 Le 28/05/2022, à 02: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, à 02:57

MicP

Re : [Résolu x3]Remplacer chaine/bloc de caractères dans plusieurs fichiers

Très content d'avoir pu t'aider smile

Hors ligne

#13 Le 04/07/2023, à 13: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, à 13: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, à 02:02)

Hors ligne

#15 Le 04/07/2023, à 14: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, à 17: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, à 17:42)

Hors ligne

#17 Le 04/07/2023, à 23: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 smile

Hors ligne

#18 Le 04/07/2023, à 23:55

iznobe

Re : [Résolu x3]Remplacer chaine/bloc de caractères dans plusieurs fichiers

Bonsoir , juste pour faire raler @MicP au passage tongue ( je suis bien incapable d ' ecrire ce genre de commande )

MicP a écrit :

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 big_smile

Dernière modification par iznobe (Le 04/07/2023, à 23:56)


retour utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#19 Le 05/07/2023, à 02:20

MicP

Re : [Résolu x3]Remplacer chaine/bloc de caractères dans plusieurs fichiers

Ça a marché wink J'ai effectivement commencé par râler,
… puis j'ai relu ton message, mais cette fois depuis la première ligne big_smile

Dernière modification par MicP (Le 05/07/2023, à 02:20)

Hors ligne