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.

#26 Le 06/08/2020, à 07:37

beuguissime

Re : [résolu] créer un script simple pour traitement de fichier par lot

Bonjour,

Oui MicP, utiliser le $ pour forcer le remplacement d'une chaîne en fin de ligne est une autre façon de rendre l'expression régulière moins permissive. smile
D'ailleurs, c'est ce que je ferai si j'avais la certitude que la ligne ne comporte que le chemin complet d'un fichier FLAC.

Je n'en ai pas parlé car mon message était déjà long et en plus, au n°9, tu as judicieusement relevé la présence possible d'une tabulation après le nom du fichier. Tu demandes confirmation à Xzu Rukneg ; j'ai un peu le lu le fil en diagonale et je n'ai pas vu de réponse claire à cette question : je n'ai pas compris si cette tabulation était systématiquement là. Donc en cas de présence de la tabulation, il faudrait utiliser

's/flac\t$/ogg\t/g'
$ echo -e "Le flacon brisé.flac\t_" | sed 's/\.flac\t$/.ogg\t/g'
Le flacon brisé.ogg	_

(j'ai utilisé le caractère souligné _ pour mettre en évidence la tabulation finale).

NB : C'est aussi possible de former une expression régulière pour gérer le cas de figure où la tabulation peut être ou peut ne pas être là.

Dernière modification par beuguissime (Le 06/08/2020, à 12:44)

Hors ligne

#27 Le 06/08/2020, à 08:37

kamaris

Re : [résolu] créer un script simple pour traitement de fichier par lot

Xzu Rukneg a écrit :

Donc dit moi si je me trompe:
- le \ est nécessaire pour rechercher .flac au lieu de flac, ce qui explique pourquoi ça fonctionnerait aussi sans. Vaut donc mieux le laisser pour cette commande ci.

Q:
- c'est quoi ce message d'erreur sur le caractère 39? (#19) pige pas.
- y aurait-il d'autres caractère à protéger que le point ?  comment savoir?
- le "\t qui correspond à un caractère de tabulation", c'est bien à cause de l'interprétation du shell à cause des guillemets doubles?

  • Je trouve l'explication de beuguissime en #24 très claire, donc je te renvoie vers elle.

  • Le message d'erreur provient probablement de ce que tu as mis un antislash devant le 1 de 16 dans l'expression de remplacement, ce qui amène sed à chercher une référence arrière : c'est un autre cas où l'antislash donne un sens particulier au caractère qu'il précède. Pour savoir ce qu'est une référence arrière, vois le lien donné dans le point suivant.

  • Oui, il y a d'autres caractères à protéger que le point, et la liste diffère selon qu'on fait des expressions régulières basiques (par défaut avec sed) ou étendues (option -E de sed). Pour tout savoir au sujet de sed et en particulier de ses expressions régulières, il te faut consulter le manuel en ligne : https://www.gnu.org/software/sed/manual … xpressions. Tu disposes également de ce manuel en local par la commande info sed, mais la lecture en sera moins confortable. Et tu peux aussi te servir de man sed comme aide-mémoire, mais c'est très incomplet.

  • Non, sed (et ses expressions régulières) et le shell sont deux choses différentes, qui se superposent en quelques sortes. \t est un caractère de tabulation en expressions régulières, c'est une chose. Mais par ailleurs, l'antislash est parfois interprété par le shell lorsqu'il se trouve dans des guillemets doubles, comme par exemple devant un $ ou un autre antislash, c'est pourquoi il vaut toujours mieux utiliser des guillemets simples pour entourer un programme sed.

Xzu Rukneg a écrit :

REM: C'est quand même pas si simple cette histoire juste pour du rechercher/remplacer!
Je veux dire par là que c'est faisable très simplement avec un éditeur, sans aucune connaissance mais juste un peu de logique.
Mais voilà que je veux faire ça "en lot", ce qui est une des fonctions initiale d'un ordi (faire tous les trucs répétitifs), et je me retrouve embarqué dans un truc d'une toute autre complexité, je ne m'attendais quand même pas à ça!
On est bien d'accord qu'il n'y a pas à priori d'outils tout simple pour ça? (pas trouvé en tous cas)

sed est un outil simple pour ça ! Mais il y a forcément un prix à payer pour faire un traitement par lot, et ce prix c'est une programmation d'une manière ou d'une autre, ici par expressions régulières.
Il est vrai cependant que sed pourrait disposer d'une option pour que le motif recherché soit considéré littérallement, comme c'est le cas pour grep avec l'option -F.

Hors ligne

#28 Le 06/08/2020, à 08:57

MicP

Re : [résolu] créer un script simple pour traitement de fichier par lot

Xzu Rukneg a écrit :

…C'est quand même pas si simple cette histoire juste pour du rechercher/remplacer! …

Ce que j'ai trouvé pas simple, c'est d'apprendre quelques bases en expressions régulières,
et je suis très très loin de savoir les utiliser.
Mais avec quelques bases de sed et de regex,
c'est presque magique de voir le travail efficace et très rapide
d'une simple ligne de commande sur un énorme paquet de fichiers.
Ça vaut vraiment le coup d'investir un peu de temps à apprendre à s'en servir.

Un truc pour apprendre sed ou autres lignes de commandes,
c'est de cliquer, par exemple, en haut à gauche d'un message sur le mot kamaris ou Watael (ou autre)
et de cliquer ensuite sur Voir les messages de cet utilisateur.
Ça donne tout plein d'exemples pratiques
avec la plupart du temps de très très bons commentaires smile

Hors ligne

#29 Le 06/08/2020, à 10:44

Xzu Rukneg

Re : [résolu] créer un script simple pour traitement de fichier par lot

Bon! Donc la solution serait bien:

sed -i -e 's%truc original1%truc modifié1%g' -e 's%\.extension1%.extension22%g' chemin/du/dossier/*.playlist

J'ai rajouté un point devant playlist pour être plus précis.
Tout bon? (pour la remonter dans le 1er message)

Sinon oui, man ou --help sont dans mes réflexes, le trucs c'est comprendre à la fois le langage et la logique. J'ai commencé par lire une doc sur sed et tout ce que j'ai compris c'est qu'il devrait faire ce que je voulais, mais pas comment! Mais vous m'avez bien guidé.

Hors ligne

#30 Le 06/08/2020, à 12:07

kamaris

Re : [résolu] créer un script simple pour traitement de fichier par lot

Je pense que cette dernière ligne de commande correspond bien à ce que tu veux faire, oui.
Liens bonus :
- pour une introduction en français aux regex, la page wikipédia est pas mal je trouve : https://fr.wikipedia.org/wiki/Expressio … li%C3%A8re
- pour sed, le grimoire souvent cité : https://www.grymoire.com/Unix/Sed.html

Hors ligne

#31 Le 06/08/2020, à 12:32

MicP

Re : [résolu] créer un script simple pour traitement de fichier par lot

Bonjour

Je pense avoir trouvé une solution qui prendra en compte l'éventuel ou les éventuels caractères espace ou/et tabulation qui suivraient le nom d'extension,
et qui supprimera ce ou ces caractères espace ou/et tabulation.

Voir : Wikipedia : Expression régulière

Et s'il n'y a qu'un seul nom de fichier (et donc d'extension) par ligne,
il n'est pas nécessaire d'utiliser le g

Ce qui donnerait :

sed -i -e 's%truc original1%truc modifié1%g' -e 's%\.extension1[[:blank:]]*$%.extension2%'  chemin/du/dossier/*.playlist

=======
Pour tester, j'ai utilisé plusieurs lignes
dont une se termine juste après le nom d'extension
et les autres ont un ou plusieurs caractères espace ou/et tabulation

michel@debT450:~$ echo -e "Le flacon brisé.flac\nLe flacon brisé.flac\t\nLe flacon brisé.flac \nLe flacon brisé.flac    \nLe flacon.flac brisé.flac\t "
Le flacon brisé.flac
Le flacon brisé.flac	
Le flacon brisé.flac 
Le flacon brisé.flac    
Le flacon.flac brisé.flac	 
michel@debT450:~$ 

(pour pouvoir visualiser les caractères espace et/ou tabulation qui sont en fin de ligne, sélectionnez toutes les lignes de ce message avec la souris)

Ce qui donne :

michel@debT450:~$ echo -e "Le flacon brisé.flac\nLe flacon brisé.flac\t\nLe flacon brisé.flac \nLe flacon brisé.flac    \nLe flacon.flac brisé.flac\t " | sed -e 's%flacon%verre%g' -e 's%\.flac[[:blank:]]*$%.ogg%'
Le verre brisé.ogg
Le verre brisé.ogg
Le verre brisé.ogg
Le verre brisé.ogg
Le verre.flac brisé.ogg
michel@debT450:~$ 

Dernière modification par MicP (Le 06/08/2020, à 13:05)

Hors ligne

#32 Le 06/08/2020, à 12:44

beuguissime

Re : [résolu] créer un script simple pour traitement de fichier par lot

Attention, dans ton exemple, tu passes de la chanson “Le flacon brisé” à “Le verre brisé”. C'est pas la même limonade big_smile

Sinon, le dernier exemple de la série illustre la nécessité du g dans l'instruction sed : le premier titre Le flacon(/Le verre) garde son extension FLAC. Je ne sais pas si c'est voulu ainsi.

Hors ligne

#33 Le 06/08/2020, à 12:47

MicP

Re : [résolu] créer un script simple pour traitement de fichier par lot

Alfred de Musset a écrit :

Qu'importe le flacon, pourvu qu'on ait l'ivresse.

tongue

=======

… le premier titre Le flacon(/Le verre) garde son extension FLAC. Je ne sais pas si c'est voulu ainsi. …

Oui, c'est voulu,
dans ma série d'exemples de noms de fichiers, il n'y a qu'un nom de fichier par ligne
et c'est pour mettre en évidence que c'est seulement le nom d'extension qui sera modifié
pour le fichier dont le nom est (entre guillemets et avec les caractères espaces et tabulations compris dans son nom) :
"Le flacon.flac brisé.flac     "

Dernière modification par MicP (Le 06/08/2020, à 13:12)

Hors ligne

#34 Le 06/08/2020, à 13:16

beuguissime

Re : [résolu] créer un script simple pour traitement de fichier par lot

Ah, je croyais que le dernier exemple consistait en deux chansons/noms de fichier sur la même ligne, “Le verre.flac” d'une part et “brisé.flac”, d'autre part. Ceci afin d'illustrer l'effet de l'option 'g' de sed.

Hors ligne

#35 Le 06/08/2020, à 13:52

MicP

Re : [résolu] créer un script simple pour traitement de fichier par lot

Choisis ce qui te vas le mieux (avec ou sans le g)

michel@debT450:~$ echo "le .flac flacondansle flacon flaconflacon.flac" | sed 's%flacon%verre%'
le .flac verredansle flacon flaconflacon.flac
michel@debT450:~$ 
michel@debT450:~$ echo "le .flac flacondansle flacon flaconflacon.flac" | sed 's%flacon%verre%g'
le .flac verredansle verre verreverre.flac
michel@debT450:~$ 

michel@debT450:~$ echo -e "le .flac flacondansle flacon .flac\t " | sed 's%\.flac%.ogg%'
le .ogg flacondansle flacon .flac	 
michel@debT450:~$ 
michel@debT450:~$ echo -e "le .flac flacondansle flacon .flac\t " | sed 's%\.flac%.ogg%g'
le .ogg flacondansle flacon .ogg	 
michel@debT450:~$ 


Le retour des trois dernières lignes de commandes
est identique => pas besoin du g

michel@debT450:~$ echo -e "le .flac flacondansle flacon .flac\t " | sed 's%\.flac[[:blank:]]*$%.ogg%'
le .flac flacondansle flacon .ogg
michel@debT450:~$ 
michel@debT450:~$ echo -e "le .flac flacondansle flacon .flac\t " | sed 's%\.flac[[:blank:]]*$%.ogg%g'
le .flac flacondansle flacon .ogg
michel@debT450:~$ 

michel@debT450:~$ echo -e "le .flac flacondansle flacon .flac" | sed 's%\.flac[[:blank:]]*$%.ogg%'
le .flac flacondansle flacon .ogg
michel@debT450:~$ 

Dernière modification par MicP (Le 06/08/2020, à 16:24)

Hors ligne