[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...



J'ai bien compris l'effet des guillemets/double quotes sur les LF. C'est limpide.
mais je crois que c'est un autre sujet.

Je pense avoir trouvé la solution, comme expliqué plus loin.


Ce que j'ai essayé d'expliquer c'est que:
- si la commande sed prend comme argument un nom de fichier, alors j'obtiens le résultat visé.
- si j'utilise la variable TRUC qui contient la même valeur que le fichier, et bien je n'arrive pas à la donner à manger à la commande sed qui me lance un "No such file or directory" (ce qui suggère qu'lle attend un nom de fichier)


Je reproduis mon exemple, avec les valeurs obtenues.


$ DOMAIN=http://toto.com/ 
Rq : noter le / final dans mon exemple, et l'utilisation de monfichier
Rq ; ci-dessous j'ai changé et utilisé monfichier

===== CECI FONCTIONNE
$ sed '/^abc\|^$/! { p; s|^|  -> '"${DOMAIN}"'|g }'  monfichier
abc-----
foo
  -> http://toto.com/foo
bar
  -> http://toto.com/bar

abc-----
baz
  -> http://toto.com/baz


$ RES=$(sed '/^abc\|^$/! { p; s|^|  -> '"${DOMAIN}"'|g }'  monfichier)
$ echo "$RES"
abc-----
foo
  -> http://toto.com/foo
bar
  -> http://toto.com/bar

abc-----
baz
  -> http://toto.com/baz


===== MAIS CECI NE FONCTIONNE PAS
A présent, mettons la chaîne multi-lignes à traiter dans une variable TRUC

$ TRUC=$(cat monfichier)
$ echo "$TRUC"
abc-----
foo
bar

abc-----
baz

$ RES=$(sed '/^abc\|^$/! { p; s|^|  -> '"${DOMAIN}"'|g }'  "$TRUC")
sed: can't read
abc-----
foo
bar

abc-----
baz
: No such file or directory:


Idem avec :
$ sed '/^abc\|^$/! { p; s|^|  -> '"${DOMAIN}"'|g }'  "$TRUC"


***
Je me dis donc qu'il faut donner à sed l'argument qu'il attend : cad un nom de fichier.
Or, ce n'est pas le cas car je lui donne la valeur d'une variable. 
Et il me répond qu'il cherche à ouvrir un fichier qui n'existe pas "No such file or directory".
***
 
Finalement, j'ai tenté d'utiliser un pipe ET CA MARCHE !!!
RES=$(echo "$TRUC" | sed '/^abc\|^$/! { p; s|^|  -> '"${DOMAIN}"'|g }')
(pas de message d'erreur)

$ echo "$RES"
abc-----
foo
  -> http://toto.com/foo
bar
  -> http://toto.com/bar

abc-----
baz
  -> http://toto.com/baz


Ça marche mais ne nous arrêtons pas là.
Quelle explication rigoureuse peut-on donner de ce phénomène ?


Merci
Cordialement
Roger



----- Mail original -----
De: "Marc Chantreux" <mc@unistra.fr>
À: "roger tarani" <roger.tarani@free.fr>
Cc: "Liste Debian" <debian-user-french@lists.debian.org>
Envoyé: Jeudi 4 Novembre 2021 19:06:30
Objet: Re: Récupérer le résultat d'une commande sed dans une variable ou un fichier : problème...

Le Thu, Nov 04, 2021 at 05:18:00PM +0100, roger.tarani@free.fr a écrit :

En préambule:

<<. cat > monfichier
abc-----
foo
bar

abc-----
baz
.

Maintenant je peux mettre en évidence l'importance des quotes dans
l'interpolation:

set $( grep -v abc monfichier )
echo $# argument dont le premier est $1
set "$( grep -v abc monfichier )"
echo $# argument dont le premier est $1
RES=$( grep -v abc monfichier )
set $RES
echo $# argument dont le premier est $1
set "$RES"
echo $# argument dont le premier est $1

qui me donne:

3 argument dont le premier est foo
1 argument dont le premier est foo bar baz
3 argument dont le premier est foo
1 argument dont le premier est foo bar baz

donc maintenant:

DOMAIN=http://toto.com
sed -rn  "p ; /^abc/d ; s,.+, -> $DOMAIN/&,p" monfichier
# CA marche

DOMAIN=http://toto.com
RES=$( sed -rn  "p ; /^abc/d ; s,.+, -> $DOMAIN/&,p" monfichier )
echo "$RES"
# CA marche

DOMAIN=http://toto.com
RES=$( sed -rn  "p ; /^abc/d ; s,.+, -> $DOMAIN/&,p" monfichier )
echo $RES
# ca marche pas

mieux ? ou alors n'ai pas vraiment compris le problème ?

-- 
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: