#1 Le 15/11/2020, à 09:57
- antistress
[Résolu] Remplacer une chaîne de caractères dans plusieurs fichiers
Bonjour,
J'ai changé mon blogue (sous PluXml : en XML, sans base de données) d'hébergement.
J'avais pris soin de n'entrer que des URL relatives dans mes billets donc pas de souci.
Par contre je m'aperçois qu'à chaque fois que j'ai commenté j'ai ajouté l'adresse de mon (ancien) blogue.
Chaque commentaire de visiteur est un fichier XML sous cette forme :
<?xml version='1.0' encoding='UTF-8'?>
<comment>
<author><![CDATA[antistress]]></author>
<type>normal</type>
<ip>176.132.209.19</ip>
<mail><![CDATA[mon_adresse.mail]]></mail>
<site><![CDATA[http://libre-ouvert.toile-libre.org]]></site>
<content><![CDATA[mon commentaire]]></content>
<parent><![CDATA[2]]></parent>
</comment>
Quelle serait la ligne de commande pour scanner (dans mon backup en local) les +600 fichiers du répertoire concerné, et remplacer la chaîne http://libre-ouvert.toile-libre.org par https://libre-ouvert.tuxfamily.org ?
Je vois qu'une demande similaire avait été postée ici : https://forum.ubuntu-fr.org/viewtopic.php?id=94987
Merci d'avance !
Dernière modification par antistress (Le 15/11/2020, à 16:10)
Blogue : Libre et ouvert
Hors ligne
#2 Le 15/11/2020, à 10:06
- bruno
Re : [Résolu] Remplacer une chaîne de caractères dans plusieurs fichiers
Un truc dans le style :
for i in /dossier/a/traiter/*; do
sed -i 's/http:\/\/libre-ouvert.toile-libre.org/https:\/\/libre-ouvert.tuxfamily.org /g' $i
done
#3 Le 15/11/2020, à 11:16
- pingouinux
Re : [Résolu] Remplacer une chaîne de caractères dans plusieurs fichiers
Bonjour,
Autre solution
sed -i 's#http://libre-ouvert.toile-libre.org#https://libre-ouvert.tuxfamily.org#g' liste_des_fichiers
Hors ligne
#4 Le 15/11/2020, à 12:41
- grigouille
Re : [Résolu] Remplacer une chaîne de caractères dans plusieurs fichiers
find -name "*.*" | xargs sed -i 's/pattern/remplacement/g'
Debian (xfce) 12
HP LaserJet M1132 MFP
Hors ligne
#5 Le 15/11/2020, à 12:43
- antistress
Re : [Résolu] Remplacer une chaîne de caractères dans plusieurs fichiers
Un truc dans le style :
for i in /dossier/a/traiter/*; do sed -i 's/http:\/\/libre-ouvert.toile-libre.org/https:\/\/libre-ouvert.tuxfamily.org/g' $i done
Merci, j'ai appliqué la commande (sans l'espace après l'adresse nouvelle de mon site) et vérifié sur un fichier au hasard, ça semble avoir marché : top !
Merci merci merci
merci à tous deux
Dernière modification par antistress (Le 15/11/2020, à 12:44)
Blogue : Libre et ouvert
Hors ligne
#6 Le 15/11/2020, à 12:49
- antistress
Re : [Résolu] Remplacer une chaîne de caractères dans plusieurs fichiers
Et si je voulais supprimer une adresse mail donnée des commentaires, il faudrait changer cette partie ?
sed -i 's/adresse_à_supprimer//g' $i
Dernière modification par antistress (Le 15/11/2020, à 12:50)
Blogue : Libre et ouvert
Hors ligne
#7 Le 15/11/2020, à 12:56
- kamaris
Re : [Résolu] Remplacer une chaîne de caractères dans plusieurs fichiers
Oui, en faisant attention d'être assez restrictif dans la définition de adresse_à_supprimer pour que ça ne te supprime pas des choses qui ne doivent pas l'être.
De même, l'option g ne devrait pas être utilisée si elle est inutile (une seule url ou adresse à recherche/remplacer par ligne).
Et tu devrais plutôt utiliser la solution proposée par pingouinux en #3 : c'est à la fois la plus rapide (un seul appel de sed) et la plus sécurisée (dans le traitement des noms de fichiers).
Hors ligne
#8 Le 15/11/2020, à 13:03
- Watael
Re : [Résolu] Remplacer une chaîne de caractères dans plusieurs fichiers
la boucle for est inutile, comme pingouinux l'a montré.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#9 Le 15/11/2020, à 13:56
- antistress
Re : [Résolu] Remplacer une chaîne de caractères dans plusieurs fichiers
Et tu devrais plutôt utiliser la solution proposée par pingouinux en #3 : c'est à la fois la plus rapide (un seul appel de sed) et la plus sécurisée (dans le traitement des noms de fichiers).
la boucle for est inutile, comme pingouinux l'a montré.
Ok, mais à quoi correspond liste_des_fichiers dans le code de pingouinux ?
Blogue : Libre et ouvert
Hors ligne
#10 Le 15/11/2020, à 13:57
- kamaris
Re : [Résolu] Remplacer une chaîne de caractères dans plusieurs fichiers
À ce que bruno a mis en entrée de sa boucle for :
sed -i 's#http://libre-ouvert.toile-libre.org#https://libre-ouvert.tuxfamily.org#' /dossier/a/traiter/*
Hors ligne
#11 Le 15/11/2020, à 14:52
- MicP
Re : [Résolu] Remplacer une chaîne de caractères dans plusieurs fichiers
Bonjour
S'il y a des sous répertoires dans le répertoire ciblé,
la commande sed râlera en disant qu'elle ne peut éditer "/chemin/nomDuSousRépertoire"
Donc, il vaudrait mieux utiliser find avec l'option -type f pour lister seulement les fichiers (et pas les noms de sous-répertoires)
et l'option -maxdepth 1 si seulement les fichiers contenus dans le répertoire ciblé sont à traiter, et pas ceux contenus dans ses sous-répertoires,
ce qui donnerait :
sed -i 's#http://libre-ouvert.toile-libre.org#https://libre-ouvert.tuxfamily.org#' $(find /chemin/répertoireCiblé/ -maxdepth 1 -type f)
Dernière modification par MicP (Le 15/11/2020, à 15:04)
Hors ligne
#12 Le 15/11/2020, à 15:03
- Watael
Re : [Résolu] Remplacer une chaîne de caractères dans plusieurs fichiers
je préférerais find ... -exec sed '...' +, plutôt que de passer une liste de noms (émanant d'une Substitution de commande), dont les caractères gênants (espaces, alinéas...) ne seront pas protégés par le shell.
et s'il faut descendre dans d'éventuels sous-répertoires, bash possède une option globstar à initialiser avec shopt; si les noms des fichiers possèdent un format qui permet de les identifier, ils ne devraient pas être confondus avec des sous-répertoires.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#13 Le 15/11/2020, à 15:06
- MicP
Re : [Résolu] Remplacer une chaîne de caractères dans plusieurs fichiers
je préférerais find ... -exec sed '...' +, plutôt que de passer une liste de noms (émanant d'une Substitution de commande), dont les caractères gênants (espaces, alinéas...) ne seront pas protégés par le shell.
Merci, j'en prends note.
Ça donnerait, avec find :
find /chemin/répertoireCiblé/ -maxdepth 1 -type f -execdir sed -i 's#http://libre-ouvert.toile-libre.org#https://libre-ouvert.tuxfamily.org#' {} \;
et pour traiter aussi les fichiers contenus dans les sous-répertoires du répertoire ciblé,
il suffira de supprimer l'option -maxdepth 1 de la ligne de commande.
Dernière modification par MicP (Le 15/11/2020, à 15:17)
Hors ligne
#14 Le 15/11/2020, à 15:20
- antistress
Re : [Résolu] Remplacer une chaîne de caractères dans plusieurs fichiers
find /chemin/répertoireCiblé/ -maxdepth 1 -type f -execdir sed -i 's#http://libre-ouvert.toile-libre.org#https://libre-ouvert.tuxfamily.org#' {} \;
et du coup, pour supprimer un mél spécifique dans les différents commentaires :
find /chemin/répertoireCiblé/ -maxdepth 1 -type f -execdir sed -i 's#mon_mél##' {} \;
?
Blogue : Libre et ouvert
Hors ligne
#15 Le 15/11/2020, à 15:55
- MicP
Re : [Résolu] Remplacer une chaîne de caractères dans plusieurs fichiers
Oui,
avec :
find /chemin/répertoireCiblé/ -maxdepth 1 -type f -execdir sed -i 's#mon_mél##' {} \;
la chaîne de caractère mon_mèl qui se trouverait dans un, plusieurs ou tous les fichier contenus dans le répertoire /chemin/répertoireCiblé/,
sera supprimée.
Dernière modification par MicP (Le 15/11/2020, à 22:50)
Hors ligne
#16 Le 15/11/2020, à 16:10
- antistress
Re : [Résolu] Remplacer une chaîne de caractères dans plusieurs fichiers
Merci à tous/toutes !
Vous êtes top
Dernière modification par antistress (Le 15/11/2020, à 16:18)
Blogue : Libre et ouvert
Hors ligne
#17 Le 19/11/2020, à 03:01
- MicP
Re : [Résolu] Remplacer une chaîne de caractères dans plusieurs fichiers
J'avais oublié de dire que si besoin,
la commande sed peut sauvegarder une copie du fichier original avant de le modifier
Avec :
find /chemin/répertoireCiblé/ -maxdepth 1 -type f -execdir sed -i.back 's#mon_mél##' {} \;
une copie du fichier original nommé monFichier.txt sera créée et nommée monFichier.txt.back
et le fichier qui sera modifié par la commande sed gardera le nom d'origine : monFichier.txt
Hors ligne