[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: