Votre navigateur est obsolète. Téléchargez un navigateur moderne, par exemple FireFox.
Léa-Linux : Forum
Le forum de Léa abrite des discussions autour des Logiciels libres.
Syndication
  • RSS ForumForum complet
  • RSS Forum - DéveloppementForum - Développement
  • RSS Forum - Développement - 324256Cette discussion

Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Important : quand vous posez une question, n'oubliez pas de nous donner les indications suffisantes pour que nous puissions répondre. En effet, la divination n'est pas le fort du Linuxien averti. Pour une meilleure compréhension, le bon usage de la grammaire et de l'orthographe est fortement encouragé. En particulier, le langage SMS est à éviter absolument. En cas d'abus, il pourra être censuré sans autre forme de procès.
Les messages dont le contenu est illégal (incitant à la haine - raciale ou autre, diffamant), ou dont le contenu est sans rapport avec le sujet du forum, ou qui sont parfaitement stupides ou hors sujet seront supprimés sans pitié. Il pourra même être fait appel au fournisseur d'accès du coupable pour faire cesser ses agissements.
» Index du forum » Développement » dura sed sed sed
Aller à la discussion: PrécédentSuivante
Action: Nouveau sujetChercherS'authentifier
dura sed sed sed
Avatar
Auteur: Fanch (IP enregistrée)
Date: le 5 juin 2007 à 15:28

Bah oui, sed est dur mais c'est sed image : fache

voilà mon souci :

j'ai un fichier qui contient pleins de truc, dont -entre autres et en pagaille- des lignes de la forme suivante :
$RACINE$repertoire1/binaire1
$RACINE$repertoire2/binaire2


Bon. Dans mon script bash j'ai une variable magiquement nommée RACINE qui contient ce par quoi la chaine '$RACINE$' doit être remplacée pour avoir un chemin cohérent vers binaire 1&2.

Historiquement, ça vient d'un script pour openVMS ; donc à l'époque une simple substitution suffisait (et c'est ce par quoi j'ai commencé -benêt que je suis-) :
sed -ie "s/\$RACINE\\$/${RACINE}/g" fichier


déjà, bon là je comprend pas pourquoi j'ai dû mettre 2 '\' après RACINE, sinon la regex match pas. Mais pire, vu que RACINE contient un truc du genre "~/maindir/pkg1/" le sed m'explose à la figure en me disant "Option inconnue pour 's'".
Ok, jusque là ça parait cohérent : l'expansion de variable me fout la commande sed en l'air, j'accepte.

du coup malin comme pas deux, je change la ligne dans mon script :
sed -ie "s/\$RACINE\\$/${RACINE//\//\\\/}/g" fichier


et ben ça marche pas mieux !!!!

et pourtant :
echo ${RACINE//\//\\\/}
~\/maindir\/pkg1\/


alors, une idée pour remplacer ce foutu '$RACINE$' par le contenu de la variable RACINE ??? image : confus

------- <br />
La meilleure façon de prédire le futur, c'est de l'inventer ~ Alan Kay

Re: dura sed sed sed
Avatar
Auteur: oudoubah (IP enregistrée)
Date: le 5 juin 2007 à 16:38

Sans commencer par parler de sed, c'est d'abord un problème de shell.

Ce qui est entre double quotes est interprété.
Ce qui est entre simple quote ne l'est pas.

Dans un premier temps, tu peux remplacer tes " par ', et voir ce que ça donne.

Tu as lu les docs. Tu es devenu un informaticien. Que tu le veuilles
ou non. Lire la doc, c'est le Premier et Unique Commandement de
l'informaticien.
-+- TP in: Guide du Linuxien pervers - "L'évangile selon St Thomas"

Re: dura sed sed sed
Avatar
Auteur: oudoubah (IP enregistrée)
Date: le 5 juin 2007 à 16:48

Ceci fonctionne chez moi :

sed "s,\$RACINE\\$,${RACINE},g"


Le problème du $, c'est qu'il signifie "fin de ligne".
J'ai utilisé comme séparateur la virgule, qui n'apparait dans aucun nom de fichier, pour éviter d'avoir des problèmes d'interprétation de ce que l'on veut vraiment faire : étant donné qu'il y a des / dans ton fichier et dans $RACINE, utiliser le / entre en conflit avec le séparateur utilisé pour sed.

Sed, c'est bien image: clin d`oeil

Tu as lu les docs. Tu es devenu un informaticien. Que tu le veuilles
ou non. Lire la doc, c'est le Premier et Unique Commandement de
l'informaticien.
-+- TP in: Guide du Linuxien pervers - "L'évangile selon St Thomas"

Re: dura sed sed sed
Avatar
Auteur: oudoubah (IP enregistrée)
Date: le 5 juin 2007 à 17:12

Fanch a écrit :


déjà, bon là je comprend pas pourquoi j'ai dû
mettre 2 '' après RACINE, sinon la regex match
pas. Mais pire, vu que RACINE contient un truc du
genre "~/maindir/pkg1/" le sed m'explose à la
figure en me disant "Option inconnue pour 's'".
Ok, jusque là ça parait cohérent : l'expansion de
variable me fout la commande sed en l'air,
j'accepte.


J'ai peut être un début d'explication :
Tu pars de l'expression
"\$RACINE\$"
et
"\$RACINE\\$"
. Cette expression est d'abord interprétée par le shell (vu que c'est entre double quotes).
Donc sed voit respectivement
$RACINE$
et
$RACINE\$


Ensuite, comme le caractère $ signifie "fin de ligne", il ne peut avoir de véritable signification "fin de ligne" qu'à la fin d'une expression. D'où une interprétation par le caractère $ pour le $ préfixant RACINE, et l'interprétation "fin de ligne" lorsque le $ se situe à la fin de l'expression régulière. Pour que sed interprète le $ final comme un $, il faut donc l'"échapper" avec une \

Donc, sed interprèterait finalement l'expression comme ceci :
$RACINEfin de ligne
et
$RACINE$
.

Au final, on a donc un \ pour empêcher l'interprétation par le shell, et un second \ pour éviter l'interprétation "fin de ligne"

Tu as lu les docs. Tu es devenu un informaticien. Que tu le veuilles
ou non. Lire la doc, c'est le Premier et Unique Commandement de
l'informaticien.
-+- TP in: Guide du Linuxien pervers - "L'évangile selon St Thomas"

Re: dura sed sed sed
Avatar
Auteur: Fanch (IP enregistrée)
Date: le 5 juin 2007 à 17:35

je me doutais bien que tu répondrais, mais je pensais pas te titiller à ce point image : content
merci beaucoup.

"sed, c'est bien" --> tu prêches un convaincu ! (en un seul mot, hein !!!)

merci pour ta solution, elle est sensiblement plus propre que celle que j'ai trouvé entre-temps :
étant relativement "bourrin" dès qu'on parle d'autre chose que de C/C++/python/C#/java, j'ai forcé l'expansion lexicale du shell avant de concaténer le tout dans la commande sed :
sed -ie "s/\$RACINE\\$/"${RACINE//\//\\\/}"/g" fichier


mais bon, vu que c'est un peu crade (et globalement très illisible pour le futur pauv' type qui devra le faire évoluer), je vais opter pour ta solution image: clin d`oeil

------- <br />
La meilleure façon de prédire le futur, c'est de l'inventer ~ Alan Kay

Re: dura sed sed sed
Auteur: MochiMochi (IP enregistrée)
Date: le 5 juin 2007 à 18:01

Salut,

Oui, c'est avant tout un problème de shell, d'ailleurs ceci fonctionne aussi (et on voit mieux les problèmes d'échappement dûs à sed) :
sed 's,$RACINE\$,'${RACINE}',g'


À l'inverse, pour ce qui est du problème entre caractère séparateur/chaîne à traiter, je n'ai jamais trouvé de solution à part compter sur une "standardisation" des données à l'entrée. image : moue

C'est à ma connaissance une limitation de sed (d'ailleurs en Perl ils ont eu la bonne idée d'introduire l'opérateur \Q pour ce genre de cas, c'est très pratique pour avoir un truc "sûr").

Fanch a écrit :

mais bon, vu que c'est un peu crade (et globalement très illisible pour le futur pauv' type qui devra le faire évoluer), je vais opter pour ta solution

Surtout, ça utilise une basherie... bienvenue dans le shell et son enfer des mille implémentations... image : tcontent

Re: dura sed sed sed
Avatar
Auteur: Fanch (IP enregistrée)
Date: le 6 juin 2007 à 08:49

MochiMochi > ouais mais je suis un peu peau de bache à la base image : flue

vi le shell pour moi c'est pas toujours trivial image : moue ... ça vaut pas un bon design pattern tout ça j'vous'y dis mam'Michu !

------- <br />
La meilleure façon de prédire le futur, c'est de l'inventer ~ Alan Kay

Re: dura sed sed sed
Auteur: MochiMochi (IP enregistrée)
Date: le 6 juin 2007 à 12:33

Salut,

Disons que c'est aussi permissif que pauvre en structures de données (en plus de devenir vite gourmand en temps d'exécution). Donc ça devient vite une usine à gaz (ou plutôt une raffinerie avec plein de tuyaux partout) lorsqu'on cherche à faire des choses complexes.



Nom du forum : (antispam) - (en développement:saisir un texte pour le message, rempli cette zone automatiquement)
Votre nom: 
Votre email: 
Sujet: 

 
Ce forum est boosté par Phorum.