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

Debutant shell rc et sed

8 réponses
Avatar
Serge Gagnon
Bonjour,

Je suis débutant en shell et j'utilise le shell rc.

J'ai un paquet de répertoire (59) qui contiènnent un Makefile chacun.
af-aspell/Makefile
az-aspell/Makefile
..

Dans chacun de ces Makefile, je veux changer une valeur par une autre
qui se trouve dans un fichier
./aspell/files/verdict
head -2 ../aspell/files/verdict
VERDICT_AF= -af-0.50-0
VERDICT_AZ= 6-az-0.02-0

Donc, en pratique, je veux changer, par exemple
DISTFILES= aspell${VERDICT_AZ}${EXTRACT_SUFX}
dans az-aspell/Makefile pour
DISTFILES= aspell-6-az-0.02-0${EXTRACT_SUFX}

Ca ne fonctionne pas, car j'ai un problème à la dernière ligne, celle
où j'utilise sed.

(Je met un backslash devant les # car mon MUA n'aime pas les lignes
qui commencent par ce charactère).

\#!/usr/local/bin/rc


DIR=`{find . -type d |grep -v CVS| sed 's/.\///g' }

for ( i in $DIR) {
DICO_SUFFIX=`{echo $i |sed 's/-aspell//g' | tr "a-z" "A-Z"}
VERDICT_DICO='${VERDICT_'^$DICO_SUFFIX^'}'
DICO_VERSION=`{grep $VERDICT_DICO ../aspell/files/verdict |awk '{print $2}'}
\# C'est ici que ça se gâte.
sed -i '' -e 's/$VERDICT_DICO/$DICO_VERSION/g' $i/Makefile
}

Je ne sais pas comment dire à sed que ce que je veux qu'il prenne en compte
c'est le contenue de la variable et non son nom.
J'ai essayé avec ' ' " " et même sans rien du tout autour de la commande
de substitution et je n'ai pas trouvé.

Bon, alors si quelqu'un peut m'éclairer, ça me ferait vraiment très plaisir.
Merci.

--
Serge Gagnon <ser_gagnon@sympatico.ca>
Quebec, Qc, Canada

8 réponses

Avatar
Laurent Wacrenier
Serge Gagnon écrit:
Dans chacun de ces Makefile, je veux changer une valeur par une autre
qui se trouve dans un fichier
./aspell/files/verdict
head -2 ../aspell/files/verdict
VERDICT_AF= -af-0.50-0
VERDICT_AZ= 6-az-0.02-0

Donc, en pratique, je veux changer, par exemple
DISTFILES= aspell${VERDICT_AZ}${EXTRACT_SUFX}
dans az-aspell/Makefile pour
DISTFILES= aspell-6-az-0.02-0${EXTRACT_SUFX}


Pourquoi ne pas dire à Makefile de charger "verdict" ?
(la façon dépend de la version de "make")

Au pire,
cat verdict Makefile > Makefile.new
puis
make -f Makefile.new

Avatar
Serge Gagnon
On Mon, 8 Nov 2004, "Laurent" == Laurent Wacrenier wrote:






Laurent> Serge Gagnon écrit:

+> Dans chacun de ces Makefile, je veux changer une valeur par une
+> autre qui se trouve dans un fichier ./aspell/files/verdict head
+> -2 ../aspell/files/verdict VERDICT_AF= -af-0.50-0 VERDICT_AZ +> 6-az-0.02-0

+> Donc, en pratique, je veux changer, par exemple DISTFILES +> aspell${VERDICT_AZ}${EXTRACT_SUFX} dans az-aspell/Makefile pour
+> DISTFILES= aspell-6-az-0.02-0${EXTRACT_SUFX}

Laurent> Pourquoi ne pas dire à Makefile de charger "verdict" ? (la
Laurent> façon dépend de la version de "make")

Oui et non. :) La version actuelle charge le verdict:

..

DISTFILES= aspell${VERDICT_AF}${EXTRACT_SUFX}
..

.include <bsd.port.pre.mk>
.include "${PORTSDIR}/textproc/aspell/files/verdict"
.include <bsd.port.post.mk>

C'est que après, il a été décidé que les version retournait dans les
Makefile et quittait le fichier verdict. Bon, ensuite, il a été décidé
que ça restait comme ça, mais, pour moi, la question restait quant à
l'utilisation de sed dans le script rc.

Merci
--
Serge Gagnon
Quebec, Qc, Canada





Avatar
Thierry Thomas
Lundi 08 novembre 2004 à 17:20 GMT, Serge Gagnon a écrit :
Bonjour,


Salut Serge,

Je suis débutant en shell et j'utilise le shell rc.


Le problème, c'est que tu utilises des trucs que personne ne connaît...
Pour nous autres, plan9 et le shell rc, c'est comme du québécois : on a
l'impression de comprendre, mais on ne sait pas le parler ;-)

Passe donc à sh ou zsh, et là on saura la différence entre une simple '
et une double ".
--
Th. Thomas.

Avatar
Serge Gagnon
On Wed, 10 Nov 2004, "Thierry" == Thierry Thomas wrote:






Thierry> Lundi 08 novembre 2004 à 17:20 GMT, Serge Gagnon a écrit :

+> Bonjour,

Thierry> Salut Serge,

+> Je suis débutant en shell et j'utilise le shell rc.

Thierry> Le problème, c'est que tu utilises des trucs que personne ne
Thierry> connaît... Pour nous autres, plan9 et le shell rc, c'est comme
Thierry> du québécois : on a l'impression de comprendre, mais on ne sait
Thierry> pas le parler ;-)

Thierry> Passe donc à sh ou zsh, et là on saura la différence entre une
Thierry> simple ' et une double ".

Non, le problème c'est que _MOI_ je ne connais pas rc ;-) , mais il y a
des types ici que je sais qu'ils conaissent ce shell sauf qu'on ne les
entend pas. Tiens, par example, je sais que Stephane Chazelas le connait
un peu, mais je serais trop gêné de le dire et de lui demander de
répondre publiquement à la question initial de ce fil.


--
Serge Gagnon
Quebec, Qc, Canada





Avatar
Stephane Chazelas
2004-11-08, 17:20(+00), Serge Gagnon:
[...]
DIR=`{find . -type d |grep -v CVS| sed 's/.///g' }


Tu peux utiliser "-prune" pour ommettre les CVS:

find . -name CVS -prune -o -type d -name '*-aspell' -print

Et tu devrais utiliser <NL> seulement comme separateur, strictly
speaking.

DIR=``('
'){find ...}

for ( i in $DIR) {
DICO_SUFFIX=`{echo $i |sed 's/-aspell//g' | tr "a-z" "A-Z"}


DICO_SUFFIX=`{basename $i -aspell}

VERDICT_DICO='${VERDICT_'^$DICO_SUFFIX^'}'
DICO_VERSION=`{grep $VERDICT_DICO ../aspell/files/verdict |awk '{print $2}'}


eval 'VERDICT_DICO = $VERDICT_'$DICO_SUFFIX

DICO_VERSION=`{awk /^$DICO_VERSION^'/ {print $2;exit}'
../aspell/files/verdict}


# C'est ici que ça se gâte.
sed -i '' -e 's/$VERDICT_DICO/$DICO_VERSION/g' $i/Makefile


sed -i '' -e s/$VERDICT_DICO/$DICO_VERSION/g $i/Makefile


}

Je ne sais pas comment dire à sed que ce que je veux qu'il prenne en compte
c'est le contenue de la variable et non son nom.


Utiliser eval

J'ai essayé avec ' ' " " et même sans rien du tout autour de la commande
de substitution et je n'ai pas trouvé.


Il n'y a pas d'autres quotes que « ' » en rc


Bon, alors si quelqu'un peut m'éclairer, ça me ferait vraiment très plaisir.
[...]


Comme d'autres l'ont deja dit, pratiquement personne ne connait
rc. C'est dommage car c'est un bien meilleur shell que les
shells Bourne, mais les habitudes ont la vie dure.

En zsh, ca s'ecrirait:

for d (**/*-aspell~*CVS*(N/)) {
var=VERDICT_${${d:t}%-aspell}
val=${(P)var}
ver=$(awk "/$val/ {print $2; exit}" ../aspell/files/verdict)
sed -i '' -e s/$val/$ver/g $d/Makefile
}

--
Stephane

Avatar
Stephane Chazelas
2004-11-11, 09:05(+00), Stephane Chazelas:
[...]
for d (**/*-aspell~*CVS*(N/)) {


Faut un "setopt extendedglob" pour le "~"

var=VERDICT_${${d:t}%-aspell}
val=${(P)var}
ver=$(awk "/$val/ {print $2; exit}" ../aspell/files/verdict)


ver=$(awk "/$val/ {print $2; exit}" ../aspell/files/verdict)

sed -i '' -e s/$val/$ver/g $d/Makefile
}

--

Stephane

Avatar
Serge Gagnon
On Thu, 11 Nov 2004, "Stephane" == Stephane Chazelas wrote:






Stephane> eval 'VERDICT_DICO = $VERDICT_'$DICO_SUFFIX

Ben ça fonctionne pas ici. J'ai un ' syntax error near '=' ' chez-moi.

Stephane> Comme d'autres l'ont deja dit, pratiquement personne ne
Stephane> connait rc. C'est dommage car c'est un bien meilleur shell que
Stephane> les shells Bourne, mais les habitudes ont la vie dure.

Ah, je savais bien que j'avais fait un bon choix de shell ;)
me reste juste à lire les man pages plus en profondeur.

Merci :)

--
Serge Gagnon
Quebec, Qc, Canada





Avatar
Stephane Chazelas
2004-11-11, 13:42(+00), Serge Gagnon:

On Thu, 11 Nov 2004, "Stephane" == Stephane Chazelas wrote:






Stephane> eval 'VERDICT_DICO = $VERDICT_'$DICO_SUFFIX

Ben ça fonctionne pas ici. J'ai un ' syntax error near '=' ' chez-moi.


Euh oui, desolé, j'avais pas testé.

eval 'VERDICT_DICO = $VERDICT_'^$DICO_SUFFIX

Stephane> Comme d'autres l'ont deja dit, pratiquement personne ne
Stephane> connait rc. C'est dommage car c'est un bien meilleur shell que
Stephane> les shells Bourne, mais les habitudes ont la vie dure.

Ah, je savais bien que j'avais fait un bon choix de shell ;)
[...]


Pas si tu veux avoir de l'aide dans les news ou partager ton
code par exemple.

--
Stephane