Le problème est qu'un motif de remplacement doit contenir des guillemets
(simple ou double peu importe), or il semblerait que sous Mac OS les
guillemets à l'intérieur de la commande sed soient supprimées.
Nous avons essayé avec les commandes suivantes :
sed -e 's/pattern/"replacement"/g'
sed -e 's/pattern/'\''replacement'\''/g'
qui malheureusement sont interprétés sous mac comme :
sed -e 's/pattern/replacement/g'
Quel astuce puis-je utiliser pour que le motif de remplacement contienne des
guillemets (et que cela fonctionne sous mac-os) ?
d'avance merci
PS: je ne sais pas s'il y a une interaction, mais la commande sed est à
l'intérieur d'un sous shell: `...`
ce sous shell fournissant des arguments à une commande de compilation.
> Le problème est qu'un motif de remplacement doit contenir des guillemets
> (simple ou double peu importe), or il semblerait que sous Mac OS les
> guillemets à l'intérieur de la commande sed soient supprimées.
> Nous avons essayé avec les commandes suivantes :
> sed -e 's/pattern/"replacement"/g'
> sed -e 's/pattern/'\''replacement'\''/g'
> qui malheureusement sont interprétés sous mac comme :
> sed -e 's/pattern/replacement/g'
Aucun problème ici, sous Mac OS X 10.4.11:
prunille:~> echo foo | /usr/bin/sed -e 's/o/"a"/g'
f"a""a"
> PS: je ne sais pas s'il y a une interaction, mais la commande sed est à
> l'intérieur d'un sous shell: `...`
Ah... c'est peut-être là qu'il y a un problème, genre une double
évaluation qui font disparaître un niveau de guillemets. Parfois
il faut mettre plusieurs backslashes à la suite pour s'en sortir
(et en plus, ça peut dépendre du shell). C'est une des horreurs
des shells...
--
Vincent Lefèvre <vin...@vinc17.org> - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)
S'il pouvait y avoir une bonne âme pour tester ce que donnent les commandes
suivantes sous Mac-OS (avec son shell par défaut), je lui en serais
reconnaissant :
echo `echo foo | sed -e 's/o/"a"/g'`
echo `echo foo | sed -e 's/o/'\''a'\''/g'`
echo `echo foo | sed -e 's/o/'\\''a'\\''/g'`
echo `echo foo | sed -e "s/o/\"a\"/g"`
echo `echo foo | sed -e "s/o/\\"a\\"/g"`
echo `echo foo | sed -e "s/o/'a'/g"`
echo `echo foo | sed -e "s/o/\'a\'/g"`
echo `echo foo | sed -e "s/o/\\'a\\'/g"`
echo `echo foo | sed -e "s/o/\\\'a\\\'/g"`
echo `echo foo | sed -e "s/o/\\\\'a\\\\'/g"`
>> Ah... c'est peut-être là qu'il y a un problème, genre une double
>> évaluation qui font disparaître un niveau de guillemets. Parfois
>> il faut mettre plusieurs backslashes à la suite pour s'en sortir
>> (et en plus, ça peut dépendre du shell). C'est une des horreurs
>> des shells...
>
> S'il pouvait y avoir une bonne âme pour tester ce que donnent les
> commandes suivantes sous Mac-OS (avec son shell par défaut), je lui en
> serais reconnaissant :
Je complète la liste, pour essayer d'être à peu prêt exhaustif avec tout ce
qui semble fonctionner sous linux.
echo `echo foo | sed -e 's/o/"a"/g'`
echo `echo foo | sed -e 's/o/'\''a'\''/g'`
echo `echo foo | sed -e 's/o/'\\''a'\\''/g'`
echo `echo foo | sed -e "s/o/\"a\"/g"`
echo `echo foo | sed -e "s/o/\\"a\\"/g"`
echo `echo foo | sed -e "s/o/'a'/g"`
echo `echo foo | sed -e "s/o/\'a\'/g"`
echo `echo foo | sed -e "s/o/\\'a\\'/g"`
echo `echo foo | sed -e "s/o/\\\'a\\\'/g"`
echo `echo foo | sed -e "s/o/\\\\'a\\\\'/g"`
echo `echo foo | sed -e 's/o/\"a\"/g'`
echo `echo foo | sed -e 's/o/\\"a\\"/g'`
echo `echo foo | sed -e 's/o/'"'a'"'/g'`
echo `echo foo | sed -e 's/o/'\"'a'\"'/g'`
echo `echo foo | sed -e 's/o/'\\"'a'\\"'/g'`
tony@my-Laptop:~$ echo `echo foo | sed -e 's/o/"a"/g'`
f"a""a"
tony@my-Laptop:~$ echo `echo foo | sed -e 's/o/'\''a'\''/g'`
f'a''a'
tony@my-Laptop:~$ echo `echo foo | sed -e 's/o/'\\''a'\\''/g'`
f'a''a'
tony@my-Laptop:~$ echo `echo foo | sed -e "s/o/\"a\"/g"`
f"a""a"
tony@my-Laptop:~$ echo `echo foo | sed -e "s/o/\\"a\\"/g"`
f"a""a"
tony@my-Laptop:~$ echo `echo foo | sed -e "s/o/'a'/g"`
f'a''a'
tony@my-Laptop:~$ echo `echo foo | sed -e "s/o/\'a\'/g"`
f'a''a'
tony@my-Laptop:~$ echo `echo foo | sed -e "s/o/\\'a\\'/g"`
f'a''a'
tony@my-Laptop:~$ echo `echo foo | sed -e "s/o/\\\'a\\\'/g"`
f'a''a'
tony@my-Laptop:~$ echo `echo foo | sed -e "s/o/\\\\'a\\\\'/g"`
f'a''a'
tony@my-Laptop:~$ echo `echo foo | sed -e 's/o/\"a\"/g'`
f"a""a"
tony@my-Laptop:~$ echo `echo foo | sed -e 's/o/\\"a\\"/g'`
f"a""a"
tony@my-Laptop:~$ echo `echo foo | sed -e 's/o/'"'a'"'/g'`
f'a''a'
tony@my-Laptop:~$ echo `echo foo | sed -e 's/o/'\"'a'\"'/g'`
f"a""a"
tony@my-Laptop:~$ echo `echo foo | sed -e 's/o/'\\"'a'\\"'/g'`
f"a""a"
Voila.
> je suis sous linux et un utilisateur sous Mac OS me rapporte un problème
> avec sed qui est utilisé dans le Makefile d'un projet.
Pour information Mac OS X est un système unix et Mac OS est l'ancien système
qui n'a rien à voir.
> Le problème est qu'un motif de remplacement doit contenir des guillemets
> (simple ou double peu importe), or il semblerait que sous Mac OS les
> guillemets à l'intérieur de la commande sed soient supprimées.
> Nous avons essayé avec les commandes suivantes :
>
> sed -e 's/pattern/"replacement"/g'
> sed -e 's/pattern/'\''replacement'\''/g'
>
> qui malheureusement sont interprétés sous mac comme :
>
> sed -e 's/pattern/replacement/g'
>
> Quel astuce puis-je utiliser pour que le motif de remplacement contienne des
> guillemets (et que cela fonctionne sous mac-os) ?
L'évaluation des caractères spéciaux est faite au niveau du shell (et pas
des commandes comme sous Windows). Sous Mac OS X (et pas Mac OS ou mac-os ou
Mac-OS), le shell par défaut était, il y a quelques années, tcsh; et est
maintenant bash. La dernière version de Mac OS X utilise la version bash du
GNU version "3.2.17(1)-release". Le programme make de Mac OS X est lui aussi
du GNU, comme sur GNU/Linux (version 3.81 pour la dernière version).
Ceci étant dit, il n'y a aucune différence d'évaluation des patterns que tu
donnes entre un bash sur Mac OS X ou un bash sur GNU/Linux (enfin au bugs
entre versions bash bien sûr).
Toute personne sous Mac OS X peut installer et configurer à sa façon le
shell qui veut, ceci n'est pas réservé aux utilisateurs GNU/Linux. On peut
trouver ainsi des shells qui ignorent la casse dans le traitement des
fichiers, d'autres non. Il serait bon de connaître la configuration qui a
été modifiée sur le Mac OS X de ton utilisateur pour connaître la cause du
problème.
--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.
> A moins que je fasse totalement fausse route ?
Voilà :-)
Les caractères spéciaux sont interprétés par le shell et pas par sed. Et le
shell standard actuel est bash du GNU, comme sur un GNU/Linux standard.
> Le programme make de Mac OS X est lui aussi du GNU, comme sur
> GNU/Linux (version 3.81 pour la dernière version).
Sous Mac OS X 10.4.11, il s'agit de GNU Make 3.80 alors que comme tu
le dis, la dernière version est la 3.81. La version de GNU Make est
importante, car GNU Make 3.81 est sensiblement incompatible avec les
versions précédentes, notamment pour être conforme à POSIX (je le sais
d'autant plus que j'ai été confronté à ce problème il y a quelques
mois, en essayant de compiler un logiciel sous un Linux avec la 3.81),
cf le fichier NEWS.
> Dans l'article <C3EA2EFF.C6362%use...@levenez.com>,
> Eric Levenez <use...@levenez.com> écrit:
>
>> Le programme make de Mac OS X est lui aussi du GNU, comme sur
>> GNU/Linux (version 3.81 pour la dernière version).
>
> Sous Mac OS X 10.4.11, il s'agit de GNU Make 3.80 alors que comme tu
> le dis, la dernière version est la 3.81. La version de GNU Make est
> importante, car GNU Make 3.81 est sensiblement incompatible avec les
> versions précédentes, notamment pour être conforme à POSIX (je le sais
> d'autant plus que j'ai été confronté à ce problème il y a quelques
> mois, en essayant de compiler un logiciel sous un Linux avec la 3.81),
> cf le fichier NEWS.
La 3.81 est celle utilisée avec le dernier Xcode d'Apple (que j'utilise avec
Mac OS X 10.5.2, je ne sais pas si elle est disponible sur Tiger).
> La 3.81 est celle utilisée avec le dernier Xcode d'Apple (que
> j'utilise avec Mac OS X 10.5.2, je ne sais pas si elle est
> disponible sur Tiger).
Ah, je ne savais pas que make était installé via Xcode (dommage
que la page man ne le dise pas). Je n'ai que Xcode 2.4.1. La 2.5
est dispo pour Tiger (j'ai dû manquer l'annonce). En revanche,
la 3.0 ne fonctionne que sous Leopard:
http://www.developpez.net/forums/showthread.php?t=436345