logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 18-02-2022 18:37:59

Linux-05
Membre
Inscription : 19-06-2020

RÉSOLU : Faire un ctrl + h sur plusieurs fichiers d'un dossier

Bonjour ,
Je suis sous Debian 10 mate ( 4.19.0-17-amd64  SMP Debian 4.19.194-3 (2021-07-18) x86_64 GNU/Linux ) et j'ai donc un éditeur de texte qui se nomme Pluma .
Je cherche à rechercher et remplacer une ligne dans quelques centaines de pages html d'un dossier qui contient plus de 2000  fichiers  de différents types .
Comment procéder ?
Je ne peux ouvrir tous les fichiers avec Pluma .
D'avance , merci .

Dernière modification par Linux-05 (19-02-2022 09:15:14)

Hors ligne

#2 18-02-2022 19:56:18

vv222
Administrateur
Lieu : Bretagne
Distrib. : Debian Sid
(G)UI : sway
Inscription : 18-11-2013
Site Web

Re : RÉSOLU : Faire un ctrl + h sur plusieurs fichiers d'un dossier

Trouver les fichiers HTML :

find ~/chemin/vers/arborescence -name \*.html


Filtrer selon ceux qui contiennent la ligne à remplacer :

| grep --files-with-matches 'La ligne à remplacer.'


Remplacer la ligne :

| sed --in-place 's/La ligne à remplacer./La nouvelle ligne./'



La version complète :

find ~/chemin/vers/arborescence -name \*.html | \
    grep --files-with-matches 'La ligne à remplacer.' | \
    sed --in-place 's/La ligne à remplacer./La nouvelle ligne./'



(il y a plein d’autres manières de faire, celle-ci n’est pas la plus optimisée, mais elle se découpe facilement pour en expliquer chaque partie)


Jouer sous Debian ? Facile !

Ceterum censeo Barum esse delendam

Hors ligne

#3 18-02-2022 20:15:43

Linux-05
Membre
Inscription : 19-06-2020

Re : RÉSOLU : Faire un ctrl + h sur plusieurs fichiers d'un dossier

Waowww ! Impressionnant , je vais faire une duplication et essayer ça , je reviens faire un retour demain matin .

Hors ligne

#4 18-02-2022 22:31:57

Linux-05
Membre
Inscription : 19-06-2020

Re : RÉSOLU : Faire un ctrl + h sur plusieurs fichiers d'un dossier

Je n'ai pas attendu jusqu'à demain pour essayer . Mais je voudrais sauvegarder sur place les fichiers ainsi transformés .
find fait bien son boulot , j'ai essayé seul ,
grep a bien fait l tri
Là j'ai un problème avec sed :

sed: pas de fichier d'entrée


j'essaye des trucs , faut lui donner un chemin pour enregistrer ? le man de l'option --in-place reste mystérieux

Hors ligne

#5 18-02-2022 22:42:44

vv222
Administrateur
Lieu : Bretagne
Distrib. : Debian Sid
(G)UI : sway
Inscription : 18-11-2013
Site Web

Re : RÉSOLU : Faire un ctrl + h sur plusieurs fichiers d'un dossier

C’est normal pour la dernière étape qui échoue, c’est moi qui me suis planté sur l’enchaînement des commandes roll

Une version corrigée :

find ~/chemin/vers/arborescence -name \*.html | \
    grep --files-with-matches 'La ligne à remplacer.' | \
    xargs sed --in-place 's/La ligne à remplacer./La nouvelle ligne./'


Jouer sous Debian ? Facile !

Ceterum censeo Barum esse delendam

Hors ligne

#6 18-02-2022 22:44:51

Linux-05
Membre
Inscription : 19-06-2020

Re : RÉSOLU : Faire un ctrl + h sur plusieurs fichiers d'un dossier

ah chouette , et ça sauvegarde la nouvelle version sur place ?

Hors ligne

#7 18-02-2022 22:51:25

Linux-05
Membre
Inscription : 19-06-2020

Re : RÉSOLU : Faire un ctrl + h sur plusieurs fichiers d'un dossier

En fait , j'ai encore cette erreur :

Sed : pas de fichier d'entrée


Il faut pas lui indiquer un input et un output ?

Hors ligne

#8 19-02-2022 02:08:39

Tawal
Membre
Distrib. : Debian Stable à jour
Noyau : amd64
(G)UI : Xfce
Inscription : 25-02-2021

Re : RÉSOLU : Faire un ctrl + h sur plusieurs fichiers d'un dossier

Hello,

Tout simplement :

shopt -s nullglob
sed --in-place 's/^La ligne à remplacer$/La nouvelle ligne./g'  /chemin/vers/arborescence/*.html


pour ne traiter que le dossier (sans récursivité).
Ou avec récursivité à partir du dossier  (2 commandes distinctes aussi) :

shopt -s nullglob globstar
sed --in-place 's/^La ligne à remplacer$/La nouvelle ligne/g'  /chemin/vers/arborescence/**/*.html



Edit:
Ajout des ancres ^ et $ et du mode g de la commande s de sed.

Edit2:

ah chouette , et ça sauvegarde la nouvelle version sur place ?


Oui mais ça écrase l'original !
Pour faire une copie de sauvegarde de l'original :

sed --in-place=.bak 's/^La ligne à remplacer$/La nouvelle ligne/g'  /chemin/vers/arborescence/**/*.html


Ça renomme le fichier d'origine avec le suffixe .bak, tu peux mettre autre chose en suffixe wink

Dernière modification par Tawal (19-02-2022 02:27:36)


Comme la science n'est pas infuse, elle se diffuse.
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

#9 19-02-2022 09:14:38

Linux-05
Membre
Inscription : 19-06-2020

Re : RÉSOLU : Faire un ctrl + h sur plusieurs fichiers d'un dossier

Super merci à vous deux !
J'ai essayé la deuxième option et ça a fonctionné !

shopt -s nullglob globstar
sed --in-place 's/^La ligne à remplacer$/La nouvelle ligne/g'  /chemin/vers/arborescence/**/*.html



Drôlement puissant sed

Hors ligne

#10 19-02-2022 11:47:47

Tawal
Membre
Distrib. : Debian Stable à jour
Noyau : amd64
(G)UI : Xfce
Inscription : 25-02-2021

Re : RÉSOLU : Faire un ctrl + h sur plusieurs fichiers d'un dossier

Pourquoi la proposition de vv222 ne fonctionne pas ?
Car avec find .... | grep "motif", le fichier d'entrée pour grep est la sortie standard de find .....
Donc, on cherche le "motif" sur les noms de fichiers trouvés par find.
Alors qu'on cherche à passer un nom de fichier à grep pour qu'il l'explore et trouve le "motif".
Pour cela, il faut passer par xargs avec :

find .... -print0 | xargs -0 grep "motif"

Tel quel, ce code renvoie les lignes où est présent le motif.
Pour renvoyer le nom des fichiers qui ont le "motif" dans leur contenu :

find .... -print0 | xargs -0 grep --files-with-matches "motif"


Ensuite on veut que sed prenne la sortie de grep (la liste des noms de fichiers contenant le "motif") comme une liste de fichiers à traiter.
On utilise encore xargs :

find .... -print0 | xargs -0 grep --files-with-matches --null "motif" | xargs -0 sed --in-place 's/.../.../g'


Et voilà smile
J'ai ajouté à find, grep les options respectives -print0 et --null pour une meilleure préhension des noms de fichiers (ça ajoute un caractère null à la fin de chaque nom de fichier renvoyé).
L'option -0 de xargs lui permet de séparer les arguments selon ce caractère null.
Bref, cf. le lien dans ma signature : Filenames and Pathnames in Shell: How to do it Correctly

Mais bon,vv222, tu nous as sorti un beau Useless Use Of Pipes tongue

Dernière modification par Tawal (19-02-2022 12:14:33)


Comme la science n'est pas infuse, elle se diffuse.
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

Pied de page des forums