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 26/11/2021, à 23:57

Romaing69

Modifier une ligne sur plusieurs fichiers

Bonjour,
J'ai tout un répertoire (décomposé en sous-répertoires) contenant plusieurs fichiers .tex
Or, j'aimerais modifier une ligne (qui n'est pas forcément présente dans le fichier ou alors elle l'est qu'une fois) par autre chose, le tout pour TOUS les fichiers .tex

Comment faire ?

Hors ligne

#2 Le 27/11/2021, à 00:07

Vobul

Re : Modifier une ligne sur plusieurs fichiers

Salut,

Tu vas avoir besoin de "sed" et possiblement de "find" également.

man find
man sed

Ça pourrait donner un truc comme ça (fait à la va-vite sans tester) :

find . -type f -name '*.tex' -exec sed -ie 's/AAA/BBB/g' \;

Il y a bien sûr d'autres approches possibles mais celle-là est celle que j'utiliserai moi.

Dernière modification par Vobul (Le 27/11/2021, à 00:08)


Vobul

Utilisez le retour utilisable de commandes !!!
J'aime la langue française, mais je parle franglais, deal with it.

Hors ligne

#3 Le 27/11/2021, à 01:34

Tawal

Re : Modifier une ligne sur plusieurs fichiers

Hello,

Je suis de ton avis Vobul.
Si il y a beaucoup de fichiers .tex, il vaudrait mieux faire :

find . -type f -name '*.tex' -exec sed -ie 's/AAA/BBB/g' '{}' \+

(il te manque le {} dans ta commande wink )
Il faut aussi dire qu'il faut être placé dans le répertoire de recherche et que AAA est remplacé par BBB.
Et que c'est récursif.

Dernière modification par Tawal (Le 27/11/2021, à 01:36)


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#4 Le 27/11/2021, à 04:41

Vobul

Re : Modifier une ligne sur plusieurs fichiers

Tawal a écrit :

(il te manque le {} dans ta commande wink )

cépafo, mais bon j'avais prévenu tongue


Vobul

Utilisez le retour utilisable de commandes !!!
J'aime la langue française, mais je parle franglais, deal with it.

Hors ligne

#5 Le 27/11/2021, à 14:19

Romaing69

Re : Modifier une ligne sur plusieurs fichiers

Avant de le faire, on est d'accord que c 'est bon là ?

find . -type f -name '*.tex' -exec sed -ie 's/"\input{*}"/"\input{C:/Users/33623/Documents/LaTeXPreambles/commands.tex}"/g' '{}' \+

Hors ligne

#6 Le 27/11/2021, à 14:33

kamaris

Re : Modifier une ligne sur plusieurs fichiers

Les guillemets autour des directives \input sont en trop, à moins qu'ils soient présents dans tes fichiers .tex (je ne me souviens plus si c'est possible).

Dernière modification par kamaris (Le 27/11/2021, à 14:34)

Hors ligne

#7 Le 27/11/2021, à 14:34

Romaing69

Re : Modifier une ligne sur plusieurs fichiers

Je les ai mis car j'avais peur que les / dans les \input perturbent la commande

Dernière modification par Romaing69 (Le 27/11/2021, à 14:34)

Hors ligne

#8 Le 27/11/2021, à 14:37

kamaris

Re : Modifier une ligne sur plusieurs fichiers

Ils la perturberont effectivement, mais ça n'est pas comme ça qu'il faut faire, et il faut aussi protéger les antislashs et l'astérisque :

find . -type f -name '*.tex' -exec sed -i 's%\\input{\*}%\\input{C:/Users/33623/Documents/LaTeXPreambles/commands.tex}%g' '{}' +

Dernière modification par kamaris (Le 27/11/2021, à 14:40)

Hors ligne

#9 Le 27/11/2021, à 14:51

Romaing69

Re : Modifier une ligne sur plusieurs fichiers

kamaris a écrit :

Ils la perturberont effectivement, mais ça n'est pas comme ça qu'il faut faire, et il faut aussi protéger les antislashs et l'astérisque :

find . -type f -name '*.tex' -exec sed -i 's%\\input{\*}%\\input{C:/Users/33623/Documents/LaTeXPreambles/commands.tex}%g' '{}' +

Mes fichiers n'ont pas changé avec cette commande

Hors ligne

#10 Le 27/11/2021, à 14:54

kamaris

Re : Modifier une ligne sur plusieurs fichiers

Que donne cette commande dans ton terminal :

echo '\input{*}' | sed 's%\\input{\*}%\\input{C:/Users/33623/Documents/LaTeXPreambles/commands.tex}%g'

Hors ligne

#11 Le 27/11/2021, à 15:32

Sciensous

Re : Modifier une ligne sur plusieurs fichiers

ou remplacer find . par find /cheminousontlesfichiers ?

Dernière modification par Sciensous (Le 27/11/2021, à 15:32)


antiX 19 (Debian Buster) et (L)Ubuntu focal 20.04
( sous LXDE et gnome-shell )

Hors ligne

#12 Le 27/11/2021, à 17:11

Romaing69

Re : Modifier une ligne sur plusieurs fichiers

kamaris a écrit :

Que donne cette commande dans ton terminal :

echo '\input{*}' | sed 's%\\input{\*}%\\input{C:/Users/33623/Documents/LaTeXPreambles/commands.tex}%g'

J'ai ça :

romaing69@PC-FIXE-LO:~/LaTeX$ echo '\input{*}' | sed 's%\\input{\*}%\\input{C:/Users/33623/Documents/LaTeXPreambles/commands.tex}%g'
\input{C:/Users/33623/Documents/LaTeXPreambles/commands.tex}

Hors ligne

#13 Le 27/11/2021, à 17:23

kamaris

Re : Modifier une ligne sur plusieurs fichiers

La commande sed fonctionne donc correctement.
Maintenant il y a soit un problème dans la commande find, que tu peux tester comme ça pour voir si elle trouve bien tes fichiers :

find . -type f -name '*.tex'

, soit un problème dans le motif à trouver dans les fichiers : \input{*}, qui n'y figure pas, ou pas tout à fait comme ça.

Hors ligne

#14 Le 27/11/2021, à 19:45

Tawal

Re : Modifier une ligne sur plusieurs fichiers

C'est peut-être aussi que c'est pas un \input{*} littéral qu'on cherche mais plutôt un \input{suite_de_caractères}.
Du coup la commande sed deviendrait :

sed 's%\\input{.*}%\\input{C:/Users/33623/Documents/LaTeXPreambles/commands.tex}%g'

Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#15 Le 28/11/2021, à 15:34

Romaing69

Re : Modifier une ligne sur plusieurs fichiers

Tawal a écrit :

C'est peut-être aussi que c'est pas un \input{*} littéral qu'on cherche mais plutôt un \input{suite_de_caractères}.
Du coup la commande sed deviendrait :

sed 's%\\input{.*}%\\input{C:/Users/33623/Documents/LaTeXPreambles/commands.tex}%g'

Oui c'est ça que je cherchais à faire ! Désolé de pas l'avoir précisé plus tôt.
J'ai donc fait cette commande

find . -type f -name '*.tex' -exec sed -i 's%\\input{.*}%\\input{C:/Users/33623/Documents/LaTeXPreambles/commands.tex}%g' '{}' +

et tout a été modifié ! Merci à vous

Dernière modification par Romaing69 (Le 28/11/2021, à 15:35)

Hors ligne

#16 Le 28/11/2021, à 20:15

kamaris

Re : Modifier une ligne sur plusieurs fichiers

Tawal a écrit :

C'est peut-être aussi que c'est pas un \input{*} littéral qu'on cherche mais plutôt un \input{suite_de_caractères}

Eh oui, bien sûr big_smile
\input{*} n'a probablement pas de sens en latex, mais ça fait trop longtemps que j'en n'ai pas fait pour y penser.

Hors ligne