Re: Récupérer le résultat d'une commande sed dans une variable ou un fichier : problème...
Bonjour,
> J'ai tenté diverses expressions, comme par exemple dans une variable :
> RES=$( sed '/^abc\|^$/! { p; s|^| -> '$DOMAIN'|g }')
* pas testé mais je doute que ton script passe avec autre chose que GNU sed.
* c'est très généralement une mauvaise idée de ne pas protéger le
résultat d'une commande avec ""
donc j'aurais tendance à écrire
RES="$( sed "
/./!d
/^abc/d
p
s|^| -> $DOMAIN|g
")"
mais écrit comme ca, sed lit stdin alors que dans
> $(sed '/^abc\|^$/! { p; s|^| -> '"$DOMAIN"'|g }' "$RES" > mon_fichier)
ca lit dans un fichier qui s'appelle "$RES" et ca écrit dans mon_fichier
> En ligne de commande, j'obtiens exactement le résultat escompté sur stdout ou dans le fichier.
* tappe la commande
* si tout s'affiche bien, tappe
RES="$(!!)"; echo "$RES"
normallement t'as la même chose. non ?
> J'obtiens le résultat aplati, sans séparateur :
> foo bar baz truc machin
c'est normal! il faut que tu comprennent la manière dont fonctionnne les
variable expansions. dans ton cas tu dois protéger l'expansion 2*:
* le moment ou il capture
RES="$( sed "
/./!d
/^abc/d
p
s|^| -> $DOMAIN|g
")"
et le moment ou tu affiches
echo "$RES" # qui ne fait pas du tout la meme chose que echo $RES
c'est parce que l'expansion de la variable se fait sur IFS:
echo -n "$IFS"|xxd
# les chaines des variables sont splitées avec " " "\t" et "\n"
si tu n'es pas sur: comme je le disais plus haut: mets des "" partout :)
> Quel mystère y a-t-il qui m'échapperait donc ?
si tu nous proposais un script avec une entrée et une sortie du genre
<<. cat > from
abc def
abc def
abc def
ok 1
ok 2
.
<<. cat > expected
-> perdu.comok 1
-> perdu.comok 2
.
DOMAIN=perdu.com
RES="$( sed "
/./!d
/^abc/d
s|^| -> $DOMAIN|g
" mon_sample )"
echo "$RES" > got
diff got expected
on pourrait probablement trouver le problème plus rapidement.
cordialement,
--
Marc Chantreux
Direction du numérique de l'Université de Strasbourg
Pôle de Calcul et Services Avancés à la Recherche (CESAR)
http://annuaire.unistra.fr/p/20200
Reply to: