Debian-facile

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

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

#1 16-03-2015 09:33:38

sechanbask
Membre
Inscription : 14-10-2009

Sed pour remplacer un UUID dans de nombreux fichiers

Bonjour,

Dans un  très grand nombre de fichier, je dois remplacer l'UUID contenu ici :

context="Catalog_PartID" index="0">788AB209-287A-42DF-9921-F0D6E6D6AF4C</ColumnConst>

par un UUID autogénéré par exemple comme ça

uuidgen | awk '{print toupper($0)}'




mais je n'arrive pas à faire fonctionner sed convenablement en essayant avec le fichier "Cyclone F400_280_RV.xml", j'ai l'erreur suivante :

 sed -i 's/"Catalog_PartID" index="0">.*</ColumnConst>/"Catalog_PartID" index="0"> foo </ColumnConst>/g' /home/cl/Cyclone\ F400_280_RV.xml
sed: -e expression n°1, caractère 47: option inconnue pour `s'
 




j'ai tenté de change le caractère de séparation, mais :

sed -i 's#/$"Catalog_PartID" index="0">.*</ColumnConst>#/$"Catalog_PartID" index="0"> foo </ColumnConst>#/$g' Cyclone\ F400_280_RV.xml
sed: -e expression n°1, caractère 98: option inconnue pour `s'
 



C'est la première fois que j'utilise sed et j'avoue que cette commande est tellement compète, que je suis un peu perdu.

Dernière modification par sechanbask (16-03-2015 09:34:51)

Hors ligne

#2 16-03-2015 09:55:44

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian Stretch/Sid/Rc-Buggy
Noyau : Linux (≥ 4.3)
(G)UI : i3-wm (≥ 4.11)
Inscription : 07-07-2008
Site Web

Re : Sed pour remplacer un UUID dans de nombreux fichiers

Salut,

Hum, c'est quoi tes « #/$ » ? La syntaxe que tu veux utiliser c'est « 's#bla#bli#g' » smile

captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#3 16-03-2015 10:29:00

sechanbask
Membre
Inscription : 14-10-2009

Re : Sed pour remplacer un UUID dans de nombreux fichiers

oublie mes #/$, j'ai tenté un truc trouvé dans un autre forum.

comment faire pour que sed fonctionne ?

Dernière modification par sechanbask (16-03-2015 10:29:10)

Hors ligne

#4 16-03-2015 17:39:04

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian Stretch/Sid/Rc-Buggy
Noyau : Linux (≥ 4.3)
(G)UI : i3-wm (≥ 4.11)
Inscription : 07-07-2008
Site Web

Re : Sed pour remplacer un UUID dans de nombreux fichiers

Sed fonctionne, ne t'en fait pas smile
Pour qu'il fasse ce que tu veux, il faut que tu comprennes ce qu'il attend comme syntaxe.
Je t'ai indiqué cette syntaxe dans mon message précédent.

Si certains points demeurent obscurs pour toi, n'hésite pas à les soulever. Mais une question aussi vague que « comment faire pour que sed fonctionne ? » risque de ne pas trouver beaucoup de réponses qui te plaisent…

captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#5 16-03-2015 17:46:06

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.8.10
(G)UI : openbox
Inscription : 26-08-2010

Re : Sed pour remplacer un UUID dans de nombreux fichiers

Salut,
Tu peux essayer le code suivant :


sed 's#\(context="Catalog_PartID" index="0">\)[^<]*\(</ColumnConst>\)#\1TonNouvelUUID_ICI\2#g'
 


En remplaçant TonNouvelUUID_ICI par l'UUID que tu désires.

Dernière modification par enicar (16-03-2015 17:49:13)


La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#6 16-03-2015 18:46:05

sechanbask
Membre
Inscription : 14-10-2009

Re : Sed pour remplacer un UUID dans de nombreux fichiers

enicar,

Merci pour ta proposition qui me fait avancer dans ma recherche, ça m'affiche me modifie bien le fichier :


sed -i 's#\(context="Catalog_PartID" index="0">\).*\(</ColumnConst>\)#\1TonNouvelUUID_ICI\2#' Cyclone\ F400_280_RV.xml



Il ne me reste plus qu'à mettre mon UUID dans une variable et à la passer à sed... et à passer mes dossiers et sous dossier pour changer le contenu des fichiers...

Dernière modification par sechanbask (16-03-2015 19:15:18)

Hors ligne

#7 16-03-2015 23:47:24

sechanbask
Membre
Inscription : 14-10-2009

Re : Sed pour remplacer un UUID dans de nombreux fichiers

j'avance en faisant des tests sur des fichiers txt et ça marche

for i in *.txt; do UUID=$(uuidgen | awk '{print toupper($0)}') && sed -i 's#\(context="Catalog_PartID" index="0">\).*\(</ColumnConst>\)#\1'"$UUID"'\2#' $i ; done



Mais vu la tonne de dossier et de sous dossiers que je dois parcourir ça serait plus simple que j'utilise find, mais je n'arrive pas :

find . -maxdepth 1 -type f -name '*.txt' -exec UUID="$(uuidgen | awk '{print toupper($0)}')" \; -exec sed -i 's#\(context="Catalog_PartID" index="0">\).*\(</ColumnConst>\)#\1'"$UUID"'\2#' {} \;
find: "UUID=3C94354F-5F80-4816-A0FC-66F64B72A71C": Aucun fichier ou dossier de ce type
find: "UUID=3C94354F-5F80-4816-A0FC-66F64B72A71C": Aucun fichier ou dossier de ce type
find: "UUID=3C94354F-5F80-4816-A0FC-66F64B72A71C": Aucun fichier ou dossier de ce type
find: "UUID=3C94354F-5F80-4816-A0FC-66F64B72A71C": Aucun fichier ou dossier de ce type
find: "UUID=3C94354F-5F80-4816-A0FC-66F64B72A71C": Aucun fichier ou dossier de ce type
 



Je ne veux pas que find parcours mes UUID mais, après avoir trouver un fichier, génère un uuid, et que sed le passe dans le fichier en cours.

Hors ligne

#8 17-03-2015 01:42:06

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian Stretch/Sid/Rc-Buggy
Noyau : Linux (≥ 4.3)
(G)UI : i3-wm (≥ 4.11)
Inscription : 07-07-2008
Site Web

Re : Sed pour remplacer un UUID dans de nombreux fichiers

Plop,

Peut-être un truc dans ce goût là ?

find . -maxdepth 1 -type f -name '*.txt' -exec sh -c 'UUID="$(uuidgen | awk '"'"'{print toupper($0)}'"'"')" ; sed -i '"'"'s#\(context="Catalog_PartID" index="0">\).*\(</ColumnConst>\)#\1'"'"'"$UUID"'"'"'\2#'"'"' {}' \;



Sinon, tu te fais un script qui fait le truc pour un fichier, et tu appelles le script depuis le -exec


captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#9 17-03-2015 09:28:55

sechanbask
Membre
Inscription : 14-10-2009

Re : Sed pour remplacer un UUID dans de nombreux fichiers

Merci pour le coup de main à tous, maintenant ça fonctionne sur tous les fichiers qui n'ont pas d'espace dans le nom.
Le souci, c'est que j'ai énormément de fichier avec un espace par exemple :

Cyclone\ F400_280_RV.xml

si je lance la commande

find . -maxdepth 1 -type f -name '*.xml' -exec sh -c 'UUID="$(uuidgen | awk '"'"'{print toupper($0)}'"'"')" ; sed -i '"'"'s#\(context="Catalog_PartID" index="0">\).*\(</ColumnConst>\)#\1'"'"'"$UUID"'"'"'\2#'"'"' {}' \;
sed: impossible de lire ./Cyclone: Aucun fichier ou dossier de ce type
sed: impossible de lire F400_280_RV.xml: Aucun fichier ou dossier de ce type



Comment gérer ce soucis ?

Dernière modification par sechanbask (17-03-2015 09:29:23)

Hors ligne

#10 17-03-2015 23:57:57

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian Stretch/Sid/Rc-Buggy
Noyau : Linux (≥ 4.3)
(G)UI : i3-wm (≥ 4.11)
Inscription : 07-07-2008
Site Web

Re : Sed pour remplacer un UUID dans de nombreux fichiers

Plop,
Tu as juste à rajouter des guillemets autour du dernier {} pour que ça donne "{}"

captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#11 18-03-2015 10:20:05

sechanbask
Membre
Inscription : 14-10-2009

Re : Sed pour remplacer un UUID dans de nombreux fichiers

Voici le code compet :

find . -type f -name "*.xml" -exec sh -c 'UUID="$(uuidgen | awk '"'"'{print toupper($0)}'"'"')" ; sed -i '"'"'s#\(context="Catalog_PartID" index="0">\).*\(</ColumnConst>\)#\1'"'"'"$UUID"'"'"'\2#'"'"' "{}"' \;
 



Merci à tous pour le coup de main

Dernière modification par sechanbask (18-03-2015 10:20:32)

Hors ligne

Pied de page des forums