Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

comment enlever le caractère tabulation dans une variable

9 réponses
Avatar
Rodolphe Mosca
Bonjour,

J'ai un fichier que je traite sous bash

j'extrais des lignes avec grep du fichier, mais elles debutent par des
tabulations
je veux enlever les caractères tabulations qui commencent la variable $toto

je voudrais un truc du genre :
toto=${toto##\t} mais il reconnais pas \t :-(
j'ai essayé avec \x009, pareil, il ne veut pas...


soyez indulgents, c'est mon premier post sur la liste ;-)

9 réponses

Avatar
Laurent Wacrenier
Rodolphe Mosca écrit:
j'extrais des lignes avec grep du fichier, mais elles debutent par des
tabulations
je veux enlever les caractères tabulations qui commencent la variable $toto


Utilise sed et non grep.

Avatar
Benoit Izac
Bonjour,

le 04/06/2004 à 14:55, Rodolphe Mosca a écrit
dans le message <40c0713e$0$308$ :

J'ai un fichier que je traite sous bash

j'extrais des lignes avec grep du fichier, mais elles debutent par des
tabulations
je veux enlever les caractères tabulations qui commencent la variable $toto

je voudrais un truc du genre :
toto=${toto##t} mais il reconnais pas t :-(
j'ai essayé avec x009, pareil, il ne veut pas...


toto=${toto##t}

--
Benoit Izac

Avatar
David LE BOURGEOIS
Bonjour,



Bonjour.

J'ai un fichier que je traite sous bash

j'extrais des lignes avec grep du fichier, mais elles debutent par des
tabulations
je veux enlever les caractères tabulations qui commencent la variable $toto



Que vient faire la variable $toto ?
Est-il possible d'avoir un bout de code, pour situer le contexte ?

je voudrais un truc du genre :
toto=${toto##t} mais il reconnais pas t :-(


Pour le caractère tabulation, pourquoi ne pas utiliser la touche
tabulation du clavier ?

~ $ foo=" bar"
~ $ echo "${foo## }"
bar

j'ai essayé avec x009, pareil, il ne veut pas...



Si j'ai bien compris, il faut rechercher le motif dans un fichier, et
lui supprimer ses tabulations éventuelles de début.
Alors je dirai :

sed 's/^ *//;/MOTIF/p;d' FICHIER

Ou plus efficace :

perl -ne 'if(/MOTIF/){s/^t*//;print}' FICHIER


soyez indulgents, c'est mon premier post sur la liste ;-)



Les pingouins ne mordent pas.


A bientôt.

--
David LE BOURGEOIS

Avatar
Laurent Wacrenier
David LE BOURGEOIS écrit:
Ou plus efficace :

perl -ne 'if(/MOTIF/){s/^t*//;print}' FICHIER


perl -pe 's/^t*// if /MOTIF/'

Avatar
Unknown
Ha ben j'ai trouvé !
il fallait juste mettre * devant...
j'ai donc : album=${album##*(tab)}
et ca fonctionne... ouf


tu aurais pu faire aussi
album=`echo $album | tr -d 't'`

Avatar
Rodolphe Mosca
On 2004-06-04 15:51:42 +0200, David LE BOURGEOIS
said:

Bonjour,



Bonjour.

J'ai un fichier que je traite sous bash

j'extrais des lignes avec grep du fichier, mais elles debutent par des
tabulations
je veux enlever les caractères tabulations qui commencent la variable $toto



Que vient faire la variable $toto ?
Est-il possible d'avoir un bout de code, pour situer le contexte ?

je voudrais un truc du genre :
toto=${toto##t} mais il reconnais pas t :-(


Pour le caractère tabulation, pourquoi ne pas utiliser la touche
tabulation du clavier ?

~ $ foo=" bar"
~ $ echo "${foo## }"
bar

j'ai essayé avec x009, pareil, il ne veut pas...



Si j'ai bien compris, il faut rechercher le motif dans un fichier, et
lui supprimer ses tabulations éventuelles de début.
Alors je dirai :

sed 's/^ *//;/MOTIF/p;d' FICHIER

Ou plus efficace :

perl -ne 'if(/MOTIF/){s/^t*//;print}' FICHIER


soyez indulgents, c'est mon premier post sur la liste ;-)



Les pingouins ne mordent pas.


A bientôt.


oui, voilà le script entier, il me sert à renommer mes mp3 (j'ai le
même pour les ogg qui fonctionne) :

#!/bin/bash
des="/Volumes/datas/Download/02music"
for mp3 in *.mp3 ; do
echo "mp3 traité est : $mp3"
num=${mp3:0:2}
id3tool $mp3 > /tmp/mp3.inf
title=$(cat /tmp/mp3.inf | grep "Song Title:")
artist=$(cat /tmp/mp3.inf | grep "Artist:")
album=$(cat /tmp/mp3.inf | grep "Album:")
artist=${artist## }
album=${album## }
album=${album## }
[ -d "$des/$artist" ] || mkdir "$des/$artist"
[ -d "$des/$artist/$album" ] || mkdir "$des/$artist/$album"
cp "$mp3" "$des/$artist/$album/$num-$title.mp3"
#echo "Titre:$title"
#echo "Artiste:$artist"
#echo "Album:$album"
done
rm /tmp/mp3.inf

Ce script fonctionne sous Linux car id3info ne renvoi pas de tab.
Là je suis sur Mac OsX et id3tool lui me renvoit des infos du style :
Artist:(tab)nom

donc je voulais faire une sélection type ligne=${ligne##(tab)}
mais il ne m'enlève rien, comme si il ne trouvait pas de tab...
pourtant j'ai vérifié l'hexa, c'est bien des tab...


Avatar
Rodolphe Mosca
On 2004-06-04 19:19:40 +0200, Rodolphe Mosca
<rodolphe.mosca@(ns)club-internet.fr> said:

On 2004-06-04 15:51:42 +0200, David LE BOURGEOIS
said:

Bonjour,



Bonjour.

J'ai un fichier que je traite sous bash

j'extrais des lignes avec grep du fichier, mais elles debutent par des
tabulations
je veux enlever les caractères tabulations qui commencent la variable $toto



Que vient faire la variable $toto ?
Est-il possible d'avoir un bout de code, pour situer le contexte ?

je voudrais un truc du genre :
toto=${toto##t} mais il reconnais pas t :-(


Pour le caractère tabulation, pourquoi ne pas utiliser la touche
tabulation du clavier ?

~ $ foo=" bar"
~ $ echo "${foo## }"
bar

j'ai essayé avec x009, pareil, il ne veut pas...



Si j'ai bien compris, il faut rechercher le motif dans un fichier, et
lui supprimer ses tabulations éventuelles de début.
Alors je dirai :

sed 's/^ *//;/MOTIF/p;d' FICHIER

Ou plus efficace :

perl -ne 'if(/MOTIF/){s/^t*//;print}' FICHIER


soyez indulgents, c'est mon premier post sur la liste ;-)



Les pingouins ne mordent pas.


A bientôt.


oui, voilà le script entier, il me sert à renommer mes mp3 (j'ai le
même pour les ogg qui fonctionne) :

#!/bin/bash
des="/Volumes/datas/Download/02music"
for mp3 in *.mp3 ; do
echo "mp3 traité est : $mp3"
num=${mp3:0:2}
id3tool $mp3 > /tmp/mp3.inf
title=$(cat /tmp/mp3.inf | grep "Song Title:")
artist=$(cat /tmp/mp3.inf | grep "Artist:")
album=$(cat /tmp/mp3.inf | grep "Album:")
artist=${artist## }
album=${album## }
album=${album## }
[ -d "$des/$artist" ] || mkdir "$des/$artist"
[ -d "$des/$artist/$album" ] || mkdir "$des/$artist/$album"
cp "$mp3" "$des/$artist/$album/$num-$title.mp3"
#echo "Titre:$title"
#echo "Artiste:$artist"
#echo "Album:$album"
done
rm /tmp/mp3.inf

Ce script fonctionne sous Linux car id3info ne renvoi pas de tab.
Là je suis sur Mac OsX et id3tool lui me renvoit des infos du style :
Artist:(tab)nom

donc je voulais faire une sélection type ligne=${ligne##(tab)}
mais il ne m'enlève rien, comme si il ne trouvait pas de tab...
pourtant j'ai vérifié l'hexa, c'est bien des tab...


Ha ben j'ai trouvé !
il fallait juste mettre * devant...
j'ai donc : album=${album##*(tab)}
et ca fonctionne... ouf



Avatar
David LE BOURGEOIS
David LE BOURGEOIS écrit:

Ou plus efficace :

perl -ne 'if(/MOTIF/){s/^t*//;print}' FICHIER



perl -pe 's/^t*// if /MOTIF/'



?

Je teste :

---8<------------
~ $ perl -pe 's/^t*// if /MOTIF/' << FIN
heredoc> MOTIF
heredoc> MOTIF
heredoc> pas motif
heredoc> pas motif
heredoc> FIN
MOTIF
MOTIF
pas motif
pas motif
---8<------------

Alors que :

---8<------------
~ $ perl -ne 'if(/MOTIF/){s/^t*//;print}' << FIN
heredoc> MOTIF
heredoc> MOTIF
heredoc> pas motif
heredoc> pas motif
heredoc> FIN
MOTIF
MOTIF
---8<------------

En fait, le but est bien de rechercher un MOTIF et de lui supprimer ses
tabulations de début, mais sans afficher tout le reste.

Ou alors ai-je mal compris ?

--
David LE BOURGEOIS


Avatar
David LE BOURGEOIS

oui, voilà le script entier, il me sert à renommer mes mp3 (j'ai le même
pour les ogg qui fonctionne) :


Les deux pourraient se regrouper en un seul.


#!/bin/bash
des="/Volumes/datas/Download/02music"
for mp3 in *.mp3 ; do
echo "mp3 traité est : $mp3"
num=${mp3:0:2}
id3tool $mp3 > /tmp/mp3.inf


id3tool "$mp3" > /tmp/mp3.inf

Les noms de fichiers (surtout pour les mp3) ont souvent des espaces, des
tirés, ... qui sont interprétés par le shell si on ne les protège pas.

Entourrer les variables de " est souvent une bonne habitude.

title=$(cat /tmp/mp3.inf | grep "Song Title:")
artist=$(cat /tmp/mp3.inf | grep "Artist:")
album=$(cat /tmp/mp3.inf | grep "Album:")


UUOC.

title="$(grep "Song Title:" /tmp/mp3.inf)"
...

artist=${artist## }
album=${album## }
album=${album## }
[ -d "$des/$artist" ] || mkdir "$des/$artist"
[ -d "$des/$artist/$album" ] || mkdir "$des/$artist/$album"
cp "$mp3" "$des/$artist/$album/$num-$title.mp3"


Attention aux effets inattendus, si des variables sont vides, et surtout
si elles le sont toutes.

#echo "Titre:$title"
#echo "Artiste:$artist"
#echo "Album:$album"
done
rm /tmp/mp3.inf

Ce script fonctionne sous Linux car id3info ne renvoi pas de tab.
Là je suis sur Mac OsX et id3tool lui me renvoit des infos du style :
Artist:(tab)nom

donc je voulais faire une sélection type ligne=${ligne##(tab)}
mais il ne m'enlève rien, comme si il ne trouvait pas de tab... pourtant
j'ai vérifié l'hexa, c'est bien des tab...



Une inspiration en Perl (pas testée) :

#!/usr/bin/perl -w

use strict;

my $des = "/Volumes/datas/Download/02music";
while (<*.mp3>) {
my ($num) = /^(d+)/;
my ($title, $artist, $album);
foreach (`id3tool "$_"`) {
$title = $1 if /Song Title:s*(.*)/;
$artist = $1 if /Artist:s*(.*)/;
$album = $1 if /Album:s*(.*)/;
}
next unless defined $num
&& defined $title
&& defined $artist
&& defined $album;
unless(-d "$des/$artist/$album") {
unless(-d "$des/$artist") {
mkdir "$des/$artist" or next;
}
mkdir "$des/$artist/$album" or next;
}
rename $_, "$des/$artist/$album/$num - $title.mp3";
print "mp3 traité est : $_n";
}


Si ça peut aider...

--
David LE BOURGEOIS