Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3492 connectés 

  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°765453
L0k
Posté le 24-12-2005 à 14:02:24  profilanswer
 

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 ?

mood
Publicité
Posté le 24-12-2005 à 14:02:24  profilanswer
 

n°765455
Profil sup​primé
Posté le 24-12-2005 à 14:05:10  answer
 

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+$//

n°765461
L0k
Posté le 24-12-2005 à 14:27:19  profilanswer
 

le problème avec tr c'est que je peux supprimer tous les espaces, mais pas seulement ceux de fin..

n°765493
L0k
Posté le 24-12-2005 à 17:31:49  profilanswer
 

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
n°765495
Profil sup​primé
Posté le 24-12-2005 à 17:37:28  answer
 

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

n°765504
L0k
Posté le 24-12-2005 à 18:00:48  profilanswer
 

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.

n°765507
Profil sup​primé
Posté le 24-12-2005 à 18:14:08  answer
 

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;

n°765508
L0k
Posté le 24-12-2005 à 18:18:58  profilanswer
 

merci, je vais voir ce que je peux en faire

n°765528
Pillow
'cos the trees won't talk
Posté le 24-12-2005 à 20:08:13  profilanswer
 

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)


 

n°765560
limax
Posté le 25-12-2005 à 09:41:12  profilanswer
 

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.

mood
Publicité
Posté le 25-12-2005 à 09:41:12  profilanswer
 

n°765945
L0k
Posté le 27-12-2005 à 00:52:33  profilanswer
 

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
n°765947
L0k
Posté le 27-12-2005 à 01:07:50  profilanswer
 

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)

n°766093
imarune
Posté le 27-12-2005 à 14:59:30  profilanswer
 

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
n°766114
L0k
Posté le 27-12-2005 à 15:25:39  profilanswer
 

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:  

n°766115
imarune
Posté le 27-12-2005 à 15:30:16  profilanswer
 

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

n°766123
L0k
Posté le 27-12-2005 à 15:44:14  profilanswer
 
n°766128
imarune
Posté le 27-12-2005 à 15:53:45  profilanswer
 


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

n°766236
L0k
Posté le 27-12-2005 à 19:54:39  profilanswer
 

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.

n°766545
imarune
Posté le 29-12-2005 à 09:59:54  profilanswer
 

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

n°766578
[Albator]
MDK un jour, MDK toujours !
Posté le 29-12-2005 à 13:05:08  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

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

 

Sujets relatifs
Menu contextuel, commande supprimer[Bureau KDE 3.4] comment supprimer l'animation sous l'icone de souris?
Supprimer une partition linux ?[BASH] Jours pair ou impair ?
[Debian] Supprimer partitions NTFS[BASH] pb de retour de ligne
Supprimer les retours d'erreur de mail avec postfix?Réinitialiser une châine SCSI
Bash: tester si un partage a bien été monté[Bash] if == et caractère quelconque
Plus de sujets relatifs à : [bash] supprimer les espaces à la fin d'une chaine de caractères ?


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)