supprimer les espaces à la fin d'une chaine de caractères ? [bash] - Codes et scripts - Linux et OS Alternatifs
Marsh Posté le 24-12-2005 à 14:05:10
man tr est ton ami...
autrement, avec sed, tu peut faire une betise du genre (attention, non, testé, ptet même pas compatible sed)
Code :
|
Marsh Posté le 24-12-2005 à 14:27:19
le problème avec tr c'est que je peux supprimer tous les espaces, mais pas seulement ceux de fin..
Marsh Posté le 24-12-2005 à 17:31:49
j'ai à peu près réussi de cette manière, mais ça présuppose qu'il n'y a pas de double espace entre les noms contenus dans la variable et au moins 2 après la fin.
Code :
|
Marsh Posté le 24-12-2005 à 17:37:28
Si non, tu te fais un petit programme en Ada et voila ....
Marsh Posté le 24-12-2005 à 18:00:48
lol, ouais mais bon c'est un peu con..
Je veux juste faire un script qui renomme automatiquement des mp3 en fonction de l'artiste et du titre de la chanson.
Marsh Posté le 24-12-2005 à 18:14:08
je te donne les 5 ligne quand même, mais il y a peut-être mieu à faire ;
with Ada.Strings, Ada.Strings.Fixed, Text_Io, Ada.Command_Line;
use Ada.Strings, Ada.Strings.Fixed, Text_Io, Ada.Command_Line;
procedure Main is -- tail_space
begin
Put(Head(Argument(1),Index_Non_Blank(Argument(1),Backward)));
end;
Marsh Posté le 24-12-2005 à 20:08:13
L0k a écrit : j'ai à peu près réussi de cette manière, mais ça présuppose qu'il n'y a pas de double espace entre les noms contenus dans la variable et au moins 2 après la fin.
|
Hum, si tu veux garder les doubles espaces dans ta variable, tu peux faire (comme l'a écrit presque correctement bibiskuk) :
Code :
|
Si tu ne veux pas de doubles espaces (ce qui est plutôt logique pour un nom de fichier), tu peux pour une fois profiter du comportement de bash avec les espaces :
Code :
|
Marsh Posté le 25-12-2005 à 09:41:12
j'imagine que tu veux l'intégrer à autre chose ou que tout simplement pour le plaisir mais il y a un soft formidable pour ceci (et plus) c'est easytag.
Marsh Posté le 27-12-2005 à 00:52:33
Pillow a écrit : Hum, si tu veux garder les doubles espaces dans ta variable, tu peux faire (comme l'a écrit presque correctement bibiskuk) :
|
Merci bcp droit ce qu'il me fallait !!
limax a écrit : j'imagine que tu veux l'intégrer à autre chose ou que tout simplement pour le plaisir mais il y a un soft formidable pour ceci (et plus) c'est easytag. |
Oui je connais, merci mais il me faut qqch pour la console uniquement :-)
Marsh Posté le 27-12-2005 à 01:07:50
encore une question, quel est le meilleur moyen d'écrire ces assignations ?
Code :
|
Marsh Posté le 27-12-2005 à 14:59:30
L0k a écrit : lol, ouais mais bon c'est un peu con.. |
J''ai écrit un script perl il y a un certain temps qui faisait l'inverse Eh oui, beaucoup de mp3 n'ont pas de tags...
il nécessite le module perl MP3::Info récupérable sur :
http://www.cpan.org/modules/by-module/MP3/
(installable avec "perl Makefile.PL;make;make install" )
En m'en inspirant, cela donne (pour ce que tu veux faire) :
----------------------------------------------------------------------------------
#!/usr/bin/perl -w
$| = 1;
use strict;
use MP3::Info;
my $Arbo = "/data/mp3";
if ( @ARGV == 1 ) {
$Arbo = $ARGV[0];
}
open ( Filelist ,"/usr/bin/find $Arbo |" );
while (<Filelist> ) {
chomp;
my $file = $_;
my @path = split('/', $file);
my $basename = $path[@path-1];
my $dirname = $file;
$dirname =~s/$basename//;
my ($tag) = get_mp3tag($file);
if ( $tag->{'ARTIST'} ) {
my $genre = $tag->{'GENRE'};
my $artist = $tag->{'ARTIST'};
my $album = $tag->{'ALBUM'};
my $title = $tag->{'TITLE'};
$genre =~s/ *$//;
$artist =~s/ *$//;
$album =~s/ *$//;
$title =~s/ *$//;
my $new_basename = join(' ',$genre,$artist,$album,$title);
$new_basename = join ('',$new_basename,".mp3" );
# on affiche : si ok, décommenter la ligne d'après
print "renommer $dirname$basename en $dirname$new_basename \n";
# rename $dirname$basename $dirname$new_basename;
}
}
close Filelist;
-----------------------------------------------------------------------------
(script à nommer rename_mp3.pl par exemple, + chmod 755 rename_mp3.pl)
tu construis ton nouveau nom avec my $new_basename = join...
Attention aux fichiers sans tag mp3 ou avec un tag incomplet, c'est pas géré dans le script...
=> si tu veux l'utiliser, il faudra le retoucher un peu
EDIT : j'ai oublié tes pb d'espace :
=> j'ai corrigé le script ( + un test sur existence du tag)
Marsh Posté le 27-12-2005 à 15:25:39
imarune a écrit : J''ai écrit un script perl il y a un certain temps qui faisait l'inverse Eh oui, beaucoup de mp3 n'ont pas de tags... |
Wow, merci !
Mon script marche aussi maintenant, mais il ne vérifie pas que les tags soient corrects, je pensait compléter après. Je vais un regarder ton script perl, ça m'intéresse.
Sinon je serais intéressé par ton autre script qui permet de tagger en fonction du nom, il te serait pas droit sous la main pour un copier-coller nan ?
Marsh Posté le 27-12-2005 à 15:30:16
L0k a écrit : Wow, merci ! |
Attention, j'ai édité le 1° script depuis que tu l'as lu...
le script inverse :
-----------------------------------------------------------------------------------
#!/usr/bin/perl -w
#===================================================================+
# set_mp3_tag.pl 05/12/04 P.C. |
#===================================================================+
# permet de renseigner les tags sur tous les fichiers mp3 d'une |
# arborescence à partir du chemin et du nom des fichiers |
#===================================================================+
# parametres : |
# 1) chemin de l'arborescence |
# |
#===================================================================+
#==================================================
# chargement modules externes
#==================================================
$| = 1;
use strict;
use MP3::Info;
#==================================================
# parametres du script
#==================================================
my $Arbo = "/data/mp3";
if ( @ARGV == 1 ) {
$Arbo = $ARGV[0];
}
#==================================================
# variables globales et fonctions
#==================================================
#==================================================
# DEBUT TRAITEMENT
#==================================================
open ( Filelist ,"/usr/bin/find $Arbo |" ) or die "Houla : couldn't run find";
my $count=0;
my $print = 0;
while (<Filelist> ) {
chomp;
my $file = $_;
my $file_name = $file;
$file_name =~s/$Arbo\///;
$count++;
if ( $file_name !~ /mp3|MP3/ ) { next; }
my @file_info=split('/',$file_name);
my $artist = "";
my $album = "";
my $title = "";
my $genre = "";
my ($tag) = get_mp3tag($file);
SWITCH : {
if ( @file_info == 1 ) {
# juste le nom du fichier : pas facile
$title = $file_info[0];
last SWITCH;
}
if ( @file_info == 2 ) {
# répertoire=artist fichier=title
$artist = $file_info[0];
$title = $file_info[1];
last SWITCH;
}
if ( @file_info == 3 ) {
# répertoire=artist ss-repertoire=album fichier=title
$artist = $file_info[0];
$album = $file_info[1];
$title = $file_info[2];
last SWITCH;
}
if ( @file_info > 3 ) {
$artist = $file_info[0];
$album = $file_info[1];
$title = $file_info[3];
}
}
my $matchstring = $artist;
$artist = lc($artist);
$matchstring = join('|',$matchstring,$artist);
my @world_artist = split('_',$artist);
$artist = "";
foreach my $word (@world_artist) {
$artist = join (' ',$artist,ucfirst(lc($word)));
}
$artist =~s/^ //;
$matchstring = join('|',$matchstring,"The $artist - ","$artist - ","The $artist ","$artist ","The $artist",$artist);
if ( $album ) {
$matchstring = join('|',"${album}_","$album ",$matchstring);
}
$album =~s/$matchstring//g;
if ( length($album) > 30 ) {
# too long
$album = substr($album,-30,30);
}
$title =~s/$matchstring|\.mp3.*?|!!s.mp3.*?//g;
if ( length($title) > 30 ) {
# too long
$title = substr($title,-30,30);
}
$print = 1;
if ( $print ) {
print "###### $file_name : \n";
if ( $tag->{'ARTIST'} ) {
print "ARTIST:$tag->{'ARTIST'}\n";
}
if ( $tag->{'ALBUM'} ) {
print "ALBUM:$tag->{'ALBUM'}\n";
}
if ( $tag->{'TITLE'} ) {
print "TITLE:$tag->{'TITLE'}\n";
}
print "artist:$artist\n";
print "album:$album\n";
print "title:$title\n";
}
if ( not $tag->{'ARTIST'} ) {
$tag->{'ARTIST'} = $artist;
}
if (( not $tag->{'ALBUM'} ) or ( length($tag->{'ALBUM'}) == 30)) {
$tag->{'ALBUM'} = $album;
}
if (( not $tag->{'TITLE'} ) or ( length($tag->{'TITLE'}) == 30) or ( length($tag->{'TITLE'}) < length($title) )) {
$tag->{'TITLE'} = $title;
}
if ( not $tag->{'GENRE'} ) {
$tag->{'GENRE'} = "rock";
}
set_mp3tag($file,$tag);
}
print "$count fichiers traités";
close Filelist;
-------------------------------------------------------------------------------------------
Marsh Posté le 27-12-2005 à 15:53:45
L0k a écrit : Merci |
Euh , j'ai oublié de te dire : commentes la ligne "set_mp3tag($file,$tag);" dans le
2° script, car tu ne seras pas forcément satisfait du résultat ...
Marsh Posté le 27-12-2005 à 19:54:39
ha j'ai encore une petite question, tu sais quelle version des tags supporte la librairie perl ? version 1 et 2 ? Parce que avec mon petit script shell ça utilise que les id3v1 et du coup le titre des chansons est limité à 30 caractères.
Marsh Posté le 29-12-2005 à 09:59:54
L0k a écrit : ha j'ai encore une petite question, tu sais quelle version des tags supporte la librairie perl ? version 1 et 2 ? Parce que avec mon petit script shell ça utilise que les id3v1 et du coup le titre des chansons est limité à 30 caractères. |
Le module supporte les 2 versions, et tu peux d'ailleurs connaitre la version utilisée sur un fichier avec $tag->get_mp3info.
Pour connaitre les fonctions disponibles, "man MP3::Info" après installation du module...
Marsh Posté le 29-12-2005 à 13:05:08
En bash:
Code :
|
En modifiant la valeur de la variable IFS, tu pourras d'un seul coup virer les espaces au début, à la fin, les doubles espaces, et remplacer les caractères "à la con" (genre underscore) par des espaces.
Marsh Posté le 24-12-2005 à 14:02:24
Salut,
Je suis en train de faire un petit script bash, ou j'ai des variables qui contiennent des chaine de caractères avec des espaces à la fin.
Comment faire pour supprimmer ces espaces à la fin ?