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 15/11/2020, à 10: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, à 17:10)

Hors ligne

#2 Le 15/11/2020, à 11: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

Hors ligne

#3 Le 15/11/2020, à 12: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, à 13: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, à 13:43

antistress

Re : [Résolu] Remplacer une chaîne de caractères dans plusieurs fichiers

bruno a écrit :

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 smile

merci à tous deux

Dernière modification par antistress (Le 15/11/2020, à 13:44)

Hors ligne

#6 Le 15/11/2020, à 13: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, à 13:50)

Hors ligne

#7 Le 15/11/2020, à 13: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, à 14: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.

Hors ligne

#9 Le 15/11/2020, à 14:56

antistress

Re : [Résolu] Remplacer une chaîne de caractères dans plusieurs fichiers

kamaris a écrit :

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).

Watael a écrit :

la boucle for est inutile, comme pingouinux l'a montré.

Ok, mais à quoi correspond liste_des_fichiers dans le code de pingouinux ?

Hors ligne

#10 Le 15/11/2020, à 14: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, à 15: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, à 16:04)

Hors ligne

#12 Le 15/11/2020, à 16: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.

Hors ligne

#13 Le 15/11/2020, à 16:06

MicP

Re : [Résolu] Remplacer une chaîne de caractères dans plusieurs fichiers

Watael a écrit :

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

Hors ligne

#14 Le 15/11/2020, à 16:20

antistress

Re : [Résolu] Remplacer une chaîne de caractères dans plusieurs fichiers

MicP a écrit :
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##' {} \;

?

Hors ligne

#15 Le 15/11/2020, à 16: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, à 23:50)

Hors ligne

#16 Le 15/11/2020, à 17:10

antistress

Re : [Résolu] Remplacer une chaîne de caractères dans plusieurs fichiers

Merci à tous/toutes !

Vous êtes top smile

Dernière modification par antistress (Le 15/11/2020, à 17:18)

Hors ligne

#17 Le 19/11/2020, à 04: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