[bash] supprimer les espaces à la fin d'une chaine de caractères ?

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

Code :
  1. var="mavaleur          "


 
Comment faire pour supprimmer ces espaces à la fin ?

Reply

Marsh Posté le 24-12-2005 à 14:02:24   

Reply

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 :
  1. s/\s+$//

Reply

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

Reply

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 :
  1. sed -e 's/[[:blank:]][[:blank:]][[:blank:]]*//g'

Message cité 1 fois
Message édité par L0k le 24-12-2005 à 17:32:54
Reply

Marsh Posté le 24-12-2005 à 17:37:28    

Si non, tu te fais un petit programme en Ada et voila ....

Reply

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.

Reply

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;

Reply

Marsh Posté le 24-12-2005 à 18:18:58    

merci, je vais voir ce que je peux en faire

Reply

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.

Code :
  1. sed -e 's/[[:blank:]][[:blank:]][[:blank:]]*//g'


Hum, si tu veux garder les doubles espaces dans ta variable, tu peux faire (comme l'a écrit presque correctement bibiskuk) :

Code :
  1. var_sans_espaces_a_la_fin=$(echo "$var" | sed -e 's/[[:blank:]]*$//')


 
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 :
  1. var_sans_doubles_espaces=$(echo $var)


 

Reply

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.

Reply

Marsh Posté le 25-12-2005 à 09:41:12   

Reply

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

Code :
  1. var_sans_espaces_a_la_fin=$(echo "$var" | sed -e 's/[[:blank:]]*$//')


 
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 :
  1. var_sans_doubles_espaces=$(echo $var)



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


Message édité par L0k le 27-12-2005 à 00:53:27
Reply

Marsh Posté le 27-12-2005 à 01:07:50    

encore une question, quel est le meilleur moyen d'écrire ces assignations ?
 

Code :
  1. artist=$(id3ed -i "$file" | grep artist | sed -e 's/[[:blank:]]*$//')
  2. artist=${artist#artist: }
  3. artist=$(echo $artist)

Reply

Marsh Posté le 27-12-2005 à 14:59:30    

L0k a écrit :

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.


 
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)

Message cité 1 fois
Message édité par imarune le 27-12-2005 à 15:23:56
Reply

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...
 
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);
  my $new_basename = join(' ',$tag->{'GENRE'},$tag->{'ARTIST'},$tag->{'ALBUM'},$tag->{'TITLE'},".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  ;)


 
 
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 ? :whistle:  

Reply

Marsh Posté le 27-12-2005 à 15:30:16    

L0k a écrit :

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 ? :whistle:


 
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;
-------------------------------------------------------------------------------------------

Reply

Marsh Posté le 27-12-2005 à 15:44:14    

Reply

Marsh Posté le 27-12-2005 à 15:53:45    


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

Reply

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.

Reply

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

Reply

Marsh Posté le 29-12-2005 à 13:05:08    

En bash:

Code :
  1. var="ma valeur          "
  2. set $var
  3. var_sans_espace_a_la_fin="$*"


 
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.


Message édité par [Albator] le 29-12-2005 à 13:07:28
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed