OVH Cloud OVH Cloud

[zsh] interpretation d'une chaine de caractere

4 réponses
Avatar
Rakotomandimby Mihamina
Bonjour,
Il y a un truc que j'ai pas compris :

$print "nomlong.MP3.ogg" | sed 's/.MP3././g'
nomlong.ogg

OK la ca marche, maintenant je change un peu la chose parceque je dois
faire des scripts shells qui font tous a peu pres la meme chose ...

$TRANSFORM="sed 's/.MP3././g'" ; print "nomlong.MP3.ogg" | $TRANSFORM
zsh: aucun fichier ou répertoire de ce type: sed 's/.MP3././g'

Et la j'avoue que je ne comprends pas pourquoi ... Il faut mettre des
delimiteurs particuliers ?
Sachant qu'au final le nom court devra etre recupéré dans une variable
avec un truc du type :

OLD_NAME=nomlong.MP3.ogg
NEW_NAME=`print ${OLD_NAME} | ${TRANSFORM}`

et donc $NEW_NAME devrait etre "nomlong.ogg"

Mais la je seche un peu ...
--
Rakotomandimby Mihamina Andrianifaharana
Tel : +33 2 38 76 43 65
http://www.rktmb.org/Members/mihamina

4 réponses

Avatar
Vincent Lefevre
Dans l'article <ccdkn7$qb$,
Rakotomandimby Mihamina écrit:

$TRANSFORM="sed 's/.MP3././g'" ; print "nomlong.MP3.ogg" | $TRANSFORM
zsh: aucun fichier ou répertoire de ce type: sed 's/.MP3././g'


C'est dû au découpage en mots. Il s'agit d'une option à positionner,
SH_WORD_SPLIT je crois. Sinon, le code suivant est préférable:

TRANSFORM=(sed 's/.MP3././g') ; print "nomlong.MP3.ogg" | $TRANSFORM

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% validated (X)HTML - Acorn / RISC OS / ARM, free software, YP17,
Championnat International des Jeux Mathématiques et Logiques, etc.
Work: CR INRIA - computer arithmetic / SPACES project at LORIA

Avatar
Rakotomandimby Mihamina
Rakotomandimby Mihamina wrote:

$TRANSFORM="sed 's/.MP3././g'" ; print "nomlong.MP3.ogg" | $TRANSFORM
^^^^^

ce $ la c'est le prompt hein ...

--
Rakotomandimby Mihamina Andrianifaharana
Tel : +33 2 38 76 43 65
http://www.rktmb.org/Members/mihamina

Avatar
Benoit Izac
Bonjour,

le 06/07/2004 à 09:59, Rakotomandimby Mihamina a écrit
dans le message <ccdkn7$qb$ :

Bonjour,
Il y a un truc que j'ai pas compris :

$print "nomlong.MP3.ogg" | sed 's/.MP3././g'
nomlong.ogg

OK la ca marche, maintenant je change un peu la chose parceque je dois
faire des scripts shells qui font tous a peu pres la meme chose ...

$TRANSFORM="sed 's/.MP3././g'" ; print "nomlong.MP3.ogg" | $TRANSFORM
zsh: aucun fichier ou répertoire de ce type: sed 's/.MP3././g'


Normal : tu passes « "sed 's/.MP3././g'" » donc il recherche a executer
un fichier qui s'apelle comme ça (avec des espaces dans son nom).

2 solutions :
- tu sépares la commande (sed) et ces arguments : | $SED $ARG
- tu évalue ta chaîne : | eval $TRANSFORM

--
Benoit Izac

Avatar
Stephane Chazelas
2004-07-06, 09:59(+02), Rakotomandimby Mihamina:
[...]
$TRANSFORM="sed 's/.MP3././g'" ; print "nomlong.MP3.ogg" | $TRANSFORM
zsh: aucun fichier ou répertoire de ce type: sed 's/.MP3././g'

Et la j'avoue que je ne comprends pas pourquoi ... Il faut mettre des
delimiteurs particuliers ?
Sachant qu'au final le nom court devra etre recupéré dans une variable
avec un truc du type :

OLD_NAME=nomlong.MP3.ogg
NEW_NAME=`print ${OLD_NAME} | ${TRANSFORM}`
[...]


Les variables, c'est surtout pour substituer du texte. Pour
substituer du code, on utilise plutot des fonctions:

transform() {
sed 's/.MP3././g'
}
NEW_NAME=$(print -r -- $OLD_NAME | transform)

(Note le backslash devant les "." ou "." signifie "n'importe
quel character").

Note que c'est "print -r --" pour afficher n'importe quel texte.
"print" tout court, c'est un peu comme "echo".

Voir aussi NEW_NAME=$(transform <<< $OLD_NAME)

Mais note que si tu as lu la page info des "Modifiers", tu sais
maintenant que:

NEW_NAME=$OLD_NAME:gs/.MP3././

suffit.

Voir aussi:

NEW_NAME=${OLD_NAME//.MP3./.}

pour compatibilité avec ksh93/bash.

--
Stephane