[gull] Shell - comment obtenir une partie du contenu d'une variable ?

Daniel Cordey dc at mjt.ch
Wed Jul 16 17:25:02 CEST 2003


On Wednesday 16 July 2003 16:56, B . Carrupt wrote:

> un.deux.trois ---> un.deux
> quatre.cinq.six ---> quatre.cinq

x='un.deux.trois'
y='quatre.cinq.six'

echo ${x%%.trois}
un.deux

echo ${y%%.six}
quatre.cinq

echo ${x##un.}
deux.trois

Mais bon, c'est assez limite bien que l'on puisse utiliser une variable pour 
le "pattern". On peut aussi faire :

echo $( echo ${x} | sed 's/\.[a-z]+$//')

Mais, la, ca devient franchement ridicule... on peut aussi passer par awk avec 
des performances un poil meilleures mais bon... et tu vas voir les Perlistes 
se dechainer. En quoi ils auront raison puisque le shell n'est pas destine a 
manipuler des chaines de caracteres.

Toutefois, la chose peut devenir interessante si, comme tu le dis, tu 
manipules une liste de fichiers tel que :

ls |  sed "s/\.[a-z]+$/${NewSuffix}/" 

To obtiens une liste modifiee d'un seul coup

En partant du principe que le suffix est toujours le meme...

ls |\
while read file
do
    echo "${file%%.trois}.${NewSuffix}
dobe

Ca reste performant et lisible. De plus, tu as une grande liberte de 
traitement a l'interireur de la boucle. Bref tout est combinable mais si le 
traitement necessite des calculs et des traitements de chaines de caracteres 
plus pousses, il faudrait envisager un autre langage de scripting plus 
approprie. Tel que tcl, Python, Perl, etc.

> J'ai un système RedHat 7.2, mais je pense que ça ne doit pas avoir
> d'importance.

Aucune

Daniel




More information about the gull mailing list