Re: Récupérer le résultat d'une commande sed dans une variable ou un fichier : problème...

2021-11-10 Par sujet roger . tarani
Bonsoir,
Merci pour ces précisions.

- Mail original -
De: "Marc Chantreux" 
À: "roger tarani" 
Cc: "Liste Debian" 
Envoyé: Vendredi 5 Novembre 2021 07:29:45
Objet: Re: Récupérer le résultat d'une commande sed dans une variable ou un 
fichier : problème...

salut,

Le Fri, Nov 05, 2021 at 12:31:13AM +0100, roger.tar...@free.fr a écrit :
> Et je n'ai même pas de fichier mais une variable à traiter.

de manière générale:
* passe par des pipes ou des fichiers plutot que des variables
* utilise tee et mkfifo quand le probleme d'aiguillage est complexe.

> J'avais créé un fichier pour tenter de débloquer la situation avec une 
> situation plus connue avec sed.

Ca n'est pas la plus connue: c'est la seule :) et presque tous les filtres
fonctionnent de même

sed  'des trucs a faire' fichier1 fichier2 ... fichierN
awk  'des trucs a faire' fichier1 fichier2 ... fichierN
grep 'un motif à trouver' fichier1 fichier2 ... fichierN

stdin est le fichier par defaut:

ls | sed 's/.*/* [&](&)/' | cmark

> TRUC est fournie par un traitement précédent du script.

alors utilise un fichier plutot qu'une variable

./ton_precedent_script > TRUC
< TRUC sed '...'

si tu n'as pas besoin de truc, tu peux directement piper a sed

./ton_precedent_script | sed ...

enfin si tu veux les 2 (enregistrer TRUC et passer a sed en meme temps),
tu peux faire un tee qui est une maniere efficace de dupliquer un flot
(ca fait appel à l'appel système du meme nom)

./ton_precedent_script | tee TRUC | sed '...'

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



Re: Récupérer le résultat d'une commande sed dans une variable ou un fichier : problème...

2021-11-10 Par sujet roger . tarani
Bonjour Charles,
Simple et clair.
Merci
cordialement
Rq : parce que TRUC contient des /, j'ai été obligé de prendre | au lieu de / 
comme séparateur de sed; sinon la commande plante. 

- Mail original -
De: "Charles Plessy" 
À: "Liste Debian" 
Envoyé: Vendredi 5 Novembre 2021 01:42:48
Objet: Re: Récupérer le résultat d'une commande sed dans une variable ou un 
fichier : problème...

Le Fri, Nov 05, 2021 at 12:31:13AM +0100, roger.tar...@free.fr a écrit :
> 
> Comment expliquer que la commande prend un fichier comme argument : 
> sed '/^abc\|^$/! { p; s|^| -> '"${DOMAIN}"'|g }' monfichier #SUCCES 
> 
> mais refuse de prendre la valeur d'une variable ? 
> sed '/^abc\|^$/! { p; s|^| -> '"${DOMAIN}"'|g }' "$TRUC" #ECHEC 

Bonjour Roger,

c'est comme ça que sed (et beaucoup d'autres outils) a été conçu: opérer
sur le contenu d'un fichier dont le nom est passé en argument, ou alors
sur un flux passant par l'entrée standard.

   echo 'toto' | sed 's/o/a/g'# renvoie tata
   echo 'toto' > monfichier
   sed 's/o/a/g' monfichier   # renvoie tata
   TRUC=monfichier
   sed 's/o/a/g' "$TRUC"  # renvoie tata

La variable $TRUC est remplacée par sa valeur avant que sed ne soit
executé.  La commande executée avec monfichier ou $TRUC est donc
exactement la même.

Bonne journée

-- 
Charles Plessy Nagahama, Yomitan, Okinawa, Japan
Debian Med packaging team http://www.debian.org/devel/debian-med
Tooting from work,   https://mastodon.technology/@charles_plessy
Tooting from home, https://framapiaf.org/@charles_plessy



Re: Récupérer le résultat d'une commande sed dans une variable ou un fichier : problème...

2021-11-05 Par sujet Marc Chantreux
salut,

Le Fri, Nov 05, 2021 at 12:31:13AM +0100, roger.tar...@free.fr a écrit :
> Et je n'ai même pas de fichier mais une variable à traiter.

de manière générale:
* passe par des pipes ou des fichiers plutot que des variables
* utilise tee et mkfifo quand le probleme d'aiguillage est complexe.

> J'avais créé un fichier pour tenter de débloquer la situation avec une 
> situation plus connue avec sed.

Ca n'est pas la plus connue: c'est la seule :) et presque tous les filtres
fonctionnent de même

sed  'des trucs a faire' fichier1 fichier2 ... fichierN
awk  'des trucs a faire' fichier1 fichier2 ... fichierN
grep 'un motif à trouver' fichier1 fichier2 ... fichierN

stdin est le fichier par defaut:

ls | sed 's/.*/* [&](&)/' | cmark

> TRUC est fournie par un traitement précédent du script.

alors utilise un fichier plutot qu'une variable

./ton_precedent_script > TRUC
< TRUC sed '...'

si tu n'as pas besoin de truc, tu peux directement piper a sed

./ton_precedent_script | sed ...

enfin si tu veux les 2 (enregistrer TRUC et passer a sed en meme temps),
tu peux faire un tee qui est une maniere efficace de dupliquer un flot
(ca fait appel à l'appel système du meme nom)

./ton_precedent_script | tee TRUC | sed '...'

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



Re: Récupérer le résultat d'une commande sed dans une variable ou un fichier : problème...

2021-11-04 Par sujet Charles Plessy
Le Fri, Nov 05, 2021 at 12:31:13AM +0100, roger.tar...@free.fr a écrit :
> 
> Comment expliquer que la commande prend un fichier comme argument : 
> sed '/^abc\|^$/! { p; s|^| -> '"${DOMAIN}"'|g }' monfichier #SUCCES 
> 
> mais refuse de prendre la valeur d'une variable ? 
> sed '/^abc\|^$/! { p; s|^| -> '"${DOMAIN}"'|g }' "$TRUC" #ECHEC 

Bonjour Roger,

c'est comme ça que sed (et beaucoup d'autres outils) a été conçu: opérer
sur le contenu d'un fichier dont le nom est passé en argument, ou alors
sur un flux passant par l'entrée standard.

   echo 'toto' | sed 's/o/a/g'# renvoie tata
   echo 'toto' > monfichier
   sed 's/o/a/g' monfichier   # renvoie tata
   TRUC=monfichier
   sed 's/o/a/g' "$TRUC"  # renvoie tata

La variable $TRUC est remplacée par sa valeur avant que sed ne soit
executé.  La commande executée avec monfichier ou $TRUC est donc
exactement la même.

Bonne journée

-- 
Charles Plessy Nagahama, Yomitan, Okinawa, Japan
Debian Med packaging team http://www.debian.org/devel/debian-med
Tooting from work,   https://mastodon.technology/@charles_plessy
Tooting from home, https://framapiaf.org/@charles_plessy



Re: Récupérer le résultat d'une commande sed dans une variable ou un fichier : problème...

2021-11-04 Par sujet roger . tarani
Oui, en effet, je voulais faire ça : donner la valeur d'une variable à manger à 
sed. 
Et je n'ai même pas de fichier mais une variable à traiter. 
J'avais créé un fichier pour tenter de débloquer la situation avec une 
situation plus connue avec sed. 

TRUC est fournie par un traitement précédent du script. 
Et dans le script, j'obtiens RES ainsi : 
RES=$(echo "$TRUC" | sed '/^abc\|^$/! { p; s|^| -> '"${DOMAIN}"'|g }') 

Comment expliquer que la commande prend un fichier comme argument : 
sed '/^abc\|^$/! { p; s|^| -> '"${DOMAIN}"'|g }' monfichier #SUCCES 

mais refuse de prendre la valeur d'une variable ? 
sed '/^abc\|^$/! { p; s|^| -> '"${DOMAIN}"'|g }' "$TRUC" #ECHEC 

J'ai du mal à discerner la cause exacte. 
Est-ce une simple erreur de type ? 
Par exemple, l'argument est un fichier qui contient une chaîne de caractère Vs 
une chaîne de caractère d'une variable. 

Merci encore 

De: "Marc Chantreux"  
À: "roger tarani"  
Cc: "Liste Debian"  
Envoyé: Jeudi 4 Novembre 2021 22:09:11 
Objet: Re: Récupérer le résultat d'une commande sed dans une variable ou un 
fichier : problème... 



$ TRUC=$(cat monfichier) 
$ 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 }') 



ben ... ok j'étais loin de m'imaginer que tu voulais vraiment filer le 
contenu d'une variable comme argument de sed mais oui en reprenant tes 
mails: c'était bien noté :( 

sed (comme beaucoup de filtres) une liste de fichiers a traiter en 
argument (ou alors stdin par defaut) 

au passage du coup: 

TRUC=$( cat monfichier ) 
RES=$(echo "$TRUC" | sed '/^abc\|^$/! { p; s|^| -> '"${DOMAIN}"'|g }') 

s'écrit en fait 

sed '/^abc\|^$/! { p; s|^| -> '"${DOMAIN}"'|g }' monfichier 

ou si tu veux utiliser les redirections pour avoir le nom du fichier 
devant (c'est plus simple à la relecture) 

< monfichier sed '/^abc\|^$/! { p; s|^| -> '"${DOMAIN}"'|g }' 

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


Re: Récupérer le résultat d'une commande sed dans une variable ou un fichier : problème...

2021-11-04 Par sujet Marc Chantreux
> $ TRUC=$(cat monfichier)
> $ 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 }')

ben ... ok j'étais loin de m'imaginer que tu voulais vraiment filer le
contenu d'une variable comme argument de sed mais oui en reprenant tes
mails: c'était bien noté :(

sed (comme beaucoup de filtres) une liste de fichiers a traiter en
argument (ou alors stdin par defaut)

au passage du coup:

TRUC=$( cat monfichier )
RES=$(echo "$TRUC" | sed '/^abc\|^$/! { p; s|^|  -> '"${DOMAIN}"'|g }')

s'écrit en fait

sed '/^abc\|^$/! { p; s|^|  -> '"${DOMAIN}"'|g }' monfichier

ou si tu veux utiliser les redirections pour avoir le nom du fichier
devant (c'est plus simple à la relecture)

< monfichier sed '/^abc\|^$/! { p; s|^|  -> '"${DOMAIN}"'|g }'

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



Re: Récupérer le résultat d'une commande sed dans une variable ou un fichier : problème...

2021-11-04 Par sujet roger . tarani
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" 
À: "roger tarani" 
Cc: "Liste Debian" 
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.tar...@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



Re: Récupérer le résultat d'une commande sed dans une variable ou un fichier : problème...

2021-11-04 Par sujet Marc Chantreux
Le Thu, Nov 04, 2021 at 05:18:00PM +0100, roger.tar...@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



Re: Récupérer le résultat d'une commande sed dans une variable ou un fichier : problème...

2021-11-04 Par sujet roger . tarani
Bonjour,

Je réagis rapidement :

Ma commande sed fait le boulot attendu en CLI si je prends un nom de fichier en 
argument, lequel fichier contient la chaîne multilignes à traiter.
Elle ne le fait pas quand je veux lire la chaîne multilignes qui est la MEME 
chaîne multilignes, qui est la valeur d'une variable précédemment définie (ici, 
TRUC).


Un nom de fichier est une chose : la commande va chercher ce que contient ce 
fichier.
Une variable en est une autre : la commande va lire la valeur de la variable.
... ou pas... J'ai un blanc... il doit manquer qqchose...
Faut-il effectuer une opération sur la variable TRUC qui contient la même chose 
que le fichier mon_fichier, pour pouvoir donner à sed l'argument qu'il attend 
(cad un nom de fichier) ?...


Rappel :
Le fichier contient une liste de lignes (dont certaines sont vides ou 
commencent par abc, sur lesquelles on ne fait aucun traitement ; mais c'est 
accessoire)
abc-
foo
bar

abc-
baz


Après le traitement, on veut :
abc-
foo
  -> http://toto.com/foo
bar
  -> http://toto.com/bar

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


CECI FONCTIONNE
$ sed '/^abc\|^$/! { p; s|^|  -> '"${DOMAIN}"'|g }'  mon_fichier
(affiche le résultat visé) 

$ RES=$(sed '/^abc\|^$/! { p; s|^|  -> '"${DOMAIN}"'|g }'  mon_fichier)
$ echo "$RES"
(affiche le résultat visé) 

CECI NE FONCTIONNE PAS 
A présent, mettons la chaîne multi-lignes à traiter dans une variable TRUC
$ TRUC=$(cat mon_fichier)
$ echo "$TRUC"
(affiche le texte à traiter) 

$ RES=$(sed '/^abc\|^$/! { p; s|^|  -> '"${DOMAIN}"'|g }'  "$TRUC")
sed: can't read 
(affiche le texte à traiter): No such file or directory:

***
Je me dis donc qu'il faut donner à sed l'argument qu'il attend, cad un nom de 
fichier, ce qui n'est pas le cas, car il cherche à ouvrir un fichier qui 
n'existe pas "No such file or directory".
***


Merci
Cordialement
RT
- Mail original -
De: "Marc Chantreux" 
À: "roger tarani" 
Cc: "Liste Debian" 
Envoyé: Jeudi 4 Novembre 2021 16:54:56
Objet: 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



Re: Récupérer le résultat d'une commande sed dans une variable ou un fichier : problème...

2021-11-04 Par sujet Marc Chantreux
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



Re: Récupérer le résultat d'une commande sed dans une variable ou un fichier : problème...

2021-11-04 Par sujet Bernard Schoenacker


- Mail original - 

> De: "roger tarani" 
> À: "Liste Debian" 
> Envoyé: Jeudi 4 Novembre 2021 14:43:01
> Objet: Re: Récupérer le résultat d'une commande sed dans une variable
> ou un fichier : problème...

> Bonjour,

> Il s'agit d'imprimer la ligne, puis d'insérer une copie de la ligne
> en insérant au début de chaque ligne " -> " et la chaîne suivante
> DOMAIN=http://toto.com/

> Chaque ligne contient un nom de fichier

> $ cat mon_fichier

> foo
> bar
> baz
> truc
> machin

> Il s'agit d'obtenir ceci

> $ cat mon_fichier_resultat
> foo
> -> http://toto.com/foo

> bar
> -> http://toto.com/ bar

> baz
> -> http://toto.com/ baz
> truc
> -> http://toto.com/ truc
> machin
> -> h ttp://toto.com/ machin

> D'où la commande sed qui
> va ignorer les lignes commençant par abc ou les lignes vides :
> /^abc\|^$/!
> ... et sur les autres lignes va imprimer le PS/pattern space,
> puis effectuer la substitution convoitée, AVEC un caractère | et non
> avec / comme d'habitude car DOMAIN contient des / et cela ne permet
> pas à la commande sed s/old/new/g de fonctionner )
> { p; s|^| -> '$DOMAIN'|g }
> ou de préférence (même si la précédente sans les guillemets
> fonctionne)
> { p; s|^| -> '"$DOMAIN"'|g }

> Utiliser grep ?
> Je ne cherche pas un mot dans un fichier mais je cherche à ignorer
> les lignes commençant pas abc et les lignes vides, puis à faire le
> traitement décrit (conserver la ligne et insérer la ligne avec une
> substitution)
> Je ne vois pas bien comment faire avec grep ?

> Merci à toi

> Cordialement
> Roger

Bonjour Roger,

En premier tu t'occupes d'éliminer les lignes vides avec Sed ou avec Awk 

awk 'NF' file

documentation :

https://stackoverflow.com/questions/16414410/delete-empty-lines-using-sed
https://unix.stackexchange.com/questions/88721/match-multiple-regular-expressions-from-a-single-file-using-awk

pour l'histoire des premières lettres 'abc' dans la colonne via les 'regex 
pattern' :

https://documentacoes.wordpress.com/2017/09/13/regex-and-pattern-matching-with-awk/

pour l'histoire de colonne :

https://stackoverflow.com/questions/15361632/delete-a-column-with-awk-or-sed

Ensuite avec Awk il suffira de filtrer la bonne colonne et d'employer Echo et 
de bien convenablement tout ordonner ...

echo -e ' -> http://toto.com/$VAR' >> file-1.txt


Merci de bien vouloir résoudre le premier problème et seulement pas après pas 
avancer
de telle façon que ce soit clair et compréhensible 

Bien à toi
Bernard



Re: Récupérer le résultat d'une commande sed dans une variable ou un fichier : problème...

2021-11-04 Par sujet roger . tarani
Bonjour, 

Bien compris en ce qui concerne les LF. Merci pour ce rappel utile ( echo "$A" 
ou echo "${A}" ) 


( DOMAIN contient la valeur [ http://toto.com/ | http://toto.com/ ] ) 
Ceci fonctionnne ; 
$ sed '/^abc\|^$/! { p; s|^| -> '"${DOMAIN}"'|g }' mon_fichier 
(affiche le résultat visé) 

$ RES=$(sed '/^abc\|^$/! { p; s|^| -> '"${DOMAIN}"'|g }' mon_fichier) 
$ echo "$RES" 
(affiche le résultat visé) 


A présent, mettons la chaîne multi-lignes à traiter dans une variable TRUC 
$ TRUC=$(cat mon_fichier) 
$ echo "$TRUC" 
(affiche le texte à traiter) 

$ RES=$(sed '/^abc\|^$/! { p; s|^| -> '"${DOMAIN}"'|g }' "$TRUC") 
sed: can't read 
( affiche le texte à traiter ): No such file or directory: 

L a commande sed est correcte et c ela semble indiquer que le problème à 
résoudre est le suivant : 
Quelle est la syntaxe à respecter pour l' argument de sed, cad non pas un nom 
de fichier (qui contient la chaîne à traiter), mais une variable , ici TRUC 
(qui contient la chaîne à traiter) ?... 


Merci 
cordialement 
RT 




De: "Pierre Malard"  
À: "roger tarani"  
Cc: "Liste Debian"  
Envoyé: Jeudi 4 Novembre 2021 07:59:18 
Objet: Re: Récupérer le résultat d'une commande sed dans une variable ou un 
fichier : problème... 

Bonjour, 

C’est normal avec l’affichage d’une variable contenant des LF. Ce serait la 
même chose avec un : 
A=$(ls) 

Une piste tient dans la façon que vous utilisez pour afficher le résultat de la 
variable. En effet, un 
echo ${A} 
comme vous le faite n’affichera pas la même chose qu’un : 
echo "${A}" 

Faite l’essai, enclore une variable avec des double-guillemets est souvent non 
seulement plus clair et ne provoque pas une interprétation supplémentaire par 
le BASH. 

En plus l’utilisation des accolades est aussi un moyen d’éviter les ambiguïtés 
: 
${A}B 
n’est pas forcément la même chose que : 
${AB} 
ou $AB 






Le 4 nov. 2021 à 02:49, [ mailto:roger.tar...@free.fr | roger.tar...@free.fr ] 
a écrit : 

Bonjour, 

Dans un script (bash 5.0.3(1), debian 10), je tente de récupérer le résultat 
d'une commande sed dans une variable. 

DOMAIN= [ http://toto.com/ | http://toto.com/ ] 
sed '/^abc\|^$/! { p; s|^| -> '$DOMAIN'|g }' mon_fichier 

Dans la commande, le séparateur de la substitution est | car avec / il y a un 
conflit avec le / de la cariable DOMAIN 

J'ai tenté diverses expressions, comme par exemple dans une variable : 
RES=$( sed '/^abc\|^$/! { p; s|^| -> '$DOMAIN'|g }') 

ou en écrivant dans un fichier, avec une subsitution de commande ou sans : 
$(sed '/^abc\|^$/! { p; s|^| -> '"$DOMAIN"'|g }' "$RES" > mon_fichier) 

ou sans : 
$(sed '/^abc\|^$/! { p; s|^| -> '"$DOMAIN"'|g }' "$RES" > mon_fichier) 


Dans le script, je n'arrive pas du tout à obtenir le résultat escompté, tant 
via la variable que par le fichier : RIEN, même pas le résultat aplati/sans 
séparateur que j'obtiens en ligne de commande ci-dessous. 


En ligne de commande, j'obtiens exactement le résultat escompté sur stdout ou 
dans le fichier. 
foo 
bar 
baz 
truc 
machin 

TOUTEFOIS, il y a un indice pour la question posée. Quand je fais : 
echo $RES 

J'obtiens le résultat aplati, sans séparateur : 
foo bar baz truc machin 


J'ai écumé de nombreux forums où ce problème est soulevé. Sans trouver la clef. 

J'ai tenté de prende une valeur de DOMAIN sans / pour une expression de sed 
avec des / au lieu de | : idem. 

Quel mystère y a-t-il qui m'échapperait donc ? 
Je me dis qu'il y a une option de sed qui m'échappe ou une obscure histoire de 
contexte bash. 


Merci pour vos lumières/bougies/loupiotes ! 

Cordialement 
Roger 




-- 
Pierre Malard 

« On ne peut pas pousser à fond l'éducation politique et l'éducation 
tout court de masses sans l'accompagner d'un développement 
économique, culturel et social parallèle. » 
Romain Gary - "Les racines du ciel" 
|\ _,,,---,,_ 
/,`.-'`' -. ;-;;,_ 
|,4- ) )-,_. ,\ ( `'-' 
'---''(_/--' `-'\_) πr 

perl -e '$_=q#: 3|\ 5_,3-3,2_: 3/,`.'"'"'`'"'"' 5-. ;-;;,_: |,A- ) )-,_. ,\ ( 
`'"'"'-'"'"': '"'"'-3'"'"'2(_/--'"'"' `-'"'"'\_): 
24πr::#;y#:#\n#;s#(\D)(\d+)#$1x$2#ge;print' 
- --> Ce message n’engage que son auteur <-- 




Re: Récupérer le résultat d'une commande sed dans une variable ou un fichier : problème...

2021-11-04 Par sujet roger . tarani
Bonjour, 

Il s'agit d'imprimer la ligne, puis d'insérer une copie de la ligne en insérant 
au début de chaque ligne " -> " et la chaîne suivante 
DOMAIN=http://toto.com/ 
Chaque ligne contient un nom de fichier 

$ cat mon_fichier 
foo 
bar 
baz 
truc 
machin 


Il s'agit d'obtenir ceci 
$ cat mon_fichier_resultat 
foo 
-> http://toto.com/foo 
bar 
-> http://toto.com/ bar 
baz 
-> http://toto.com/ baz 
truc 
-> http://toto.com/ truc 
machin 
-> h ttp://toto.com/ machin 

D'où la commande sed qui 
va ignorer les lignes commençant par abc ou les lignes vides : 
/^abc\|^$/! 
... et sur les autres lignes va imprimer le PS/pattern space, 
puis effectuer la substitution convoitée, AVEC un caractère | et non avec / 
comme d'habitude car DOMAIN contient des / et cela ne permet pas à la commande 
sed s/old/new/g de fonctionner ) 
{ p; s|^| -> '$DOMAIN'|g } 
ou de préférence (même si la précédente sans les guillemets fonctionne) 
{ p; s|^| -> '"$DOMAIN"'|g } 

Utiliser grep ? 
Je ne cherche pas un mot dans un fichier mais je cherche à ignorer les lignes 
commençant pas abc et les lignes vides, puis à faire le traitement décrit 
(conserver la ligne et insérer la ligne avec une substitution) 
Je ne vois pas bien comment faire avec grep ? 

Merci à toi 

Cordialement 
Roger 



De: "Bernard Schoenacker"  
À: "roger tarani"  
Envoyé: Jeudi 4 Novembre 2021 04:12:30 
Objet: Re: Récupérer le résultat d'une commande sed dans une variable ou un 
fichier : problème... 

Bonjour Roger, 

en premier il ne faut pas prendre l'adresse complète, mais 
simplement "domain.tld" autrement tu seras contraint d'écrire 
l'adresse complète en incluant les caractères d'échappement 
après "http:// " 

Ensuite, pourrais-tu expliquer ce que tu souhaites réellement 
obtenir à la fin, car c'est un peu confus et j'ai l'impression 
que tu as fait un copié coller de scripts glané de ci et delà 
sans avoir réussi à comprendre la syntaxe  

pour l'url : 

http\:/\/\domain\.com 

désolé, mais je suis complètement rouillé et je conseille de relire la façon 
d'écrire une url dans la doc de procmail  

En solution annexe pourquoi ne pas vouloir employer grep ? 

Merci pour ton aimable attention 

Bien à toi 

Bernard 





De: "roger tarani"  
À: "Liste Debian"  
Envoyé: Jeudi 4 Novembre 2021 02:49:53 
Objet: Récupérer le résultat d'une commande sed dans une variable ou un fichier 
: problème... 

Bonjour, 

Dans un script (bash 5.0.3(1), debian 10), je tente de récupérer le résultat 
d'une commande sed dans une variable. 

DOMAIN=http://toto.com/ 
sed '/^abc\|^$/! { p; s|^| -> '$DOMAIN'|g }' mon_fichier 

Dans la commande, le séparateur de la substitution est | car avec / il y a un 
conflit avec le / de la cariable DOMAIN 

J'ai tenté diverses expressions, comme par exemple dans une variable : 
RES=$( sed '/^abc\|^$/! { p; s|^| -> '$DOMAIN'|g }') 
ou en écrivant dans un fichier, avec une subsitution de commande ou sans : 
$(sed '/^abc\|^$/! { p; s|^| -> '"$DOMAIN"'|g }' "$RES" > mon_fichier) 

ou sans : 
$(sed '/^abc\|^$/! { p; s|^| -> '"$DOMAIN"'|g }' "$RES" > mon_fichier) 


Dans le script, je n'arrive pas du tout à obtenir le résultat escompté, tant 
via la variable que par le fichier : RIEN, même pas le résultat aplati/sans 
séparateur que j'obtiens en ligne de commande ci-dessous. 


En ligne de commande, j'obtiens exactement le résultat escompté sur stdout ou 
dans le fichier. 
foo 
bar 
baz 
truc 
machin 
TOUTEFOIS, il y a un indice pour la question posée. Quand je fais : 
echo $RES 

J'obtiens le résultat aplati, sans séparateur : 
foo bar baz truc machin 


J'ai écumé de nombreux forums où ce problème est soulevé. Sans trouver la clef. 

J'ai tenté de prende une valeur de DOMAIN sans / pour une expression de sed 
avec des / au lieu de | : idem. 

Quel mystère y a-t-il qui m'échapperait donc ? 
Je me dis qu'il y a une option de sed qui m'échappe ou une obscure histoire de 
contexte bash. 


Merci pour vos lumières/bougies/loupiotes ! 

Cordialement 
Roger 






Re: Récupérer le résultat d'une commande sed dans une variable ou un fichier : problème...

2021-11-04 Par sujet Pierre Malard
Bonjour,

C’est normal avec l’affichage d’une variable contenant des LF. Ce serait la 
même chose avec un :
A=$(ls)

Une piste tient dans la façon que vous utilisez pour afficher le résultat de la 
variable. En effet, un
echo ${A}
comme vous le faite n’affichera pas la même chose qu’un :
echo "${A}"

Faite l’essai, enclore une variable avec des double-guillemets est souvent non 
seulement plus clair et ne provoque pas une interprétation supplémentaire par 
le BASH.

En plus l’utilisation des accolades est aussi un moyen d’éviter les ambiguïtés :
${A}B
n’est pas forcément la même chose que :
${AB}
ou  $AB



> Le 4 nov. 2021 à 02:49, roger.tar...@free.fr a écrit :
> 
> Bonjour,
> 
> Dans un script (bash 5.0.3(1), debian 10), je tente de récupérer le résultat 
> d'une commande sed dans une variable.
> 
>   DOMAIN=http://toto.com/
>   sed '/^abc\|^$/! { p; s|^|  -> '$DOMAIN'|g }'  mon_fichier
> 
> Dans la commande, le séparateur de la substitution est | car avec / il y a un 
> conflit avec le / de la cariable DOMAIN
> 
> J'ai tenté diverses expressions, comme par exemple dans une variable :
>   RES=$(sed '/^abc\|^$/! { p; s|^|  -> '$DOMAIN'|g }')
> 
> ou en écrivant dans un fichier, avec une subsitution de commande ou sans :
>   $(sed '/^abc\|^$/! { p; s|^|  -> '"$DOMAIN"'|g }' "$RES" > mon_fichier)
> 
> ou sans :
>   $(sed '/^abc\|^$/! { p; s|^|  -> '"$DOMAIN"'|g }' "$RES" > mon_fichier)
> 
> 
> Dans le script, je n'arrive pas du tout à obtenir le résultat escompté, tant 
> via la variable que par le fichier : RIEN, même pas le résultat aplati/sans 
> séparateur  que j'obtiens en ligne de commande ci-dessous.
> 
> 
> En ligne de commande, j'obtiens exactement le résultat escompté sur stdout ou 
> dans le fichier.
>   foo
>   bar
>   baz
>   truc
>   machin
> 
> TOUTEFOIS, il y a un indice pour la question posée. Quand je fais :
>   echo $RES
> 
> J'obtiens le résultat aplati, sans séparateur :
>   foo bar baz truc machin
> 
> 
> J'ai écumé de nombreux forums où ce problème est soulevé. Sans trouver la 
> clef.
> 
> J'ai tenté de prende une valeur de DOMAIN sans / pour une expression de sed 
> avec des / au  lieu de | : idem.
> 
> Quel mystère y a-t-il qui m'échapperait donc ?
> Je me dis qu'il y a une option de sed qui m'échappe ou une obscure histoire 
> de contexte bash.
> 
> 
> Merci pour vos lumières/bougies/loupiotes !
> 
> Cordialement
> Roger

--
Pierre Malard

  « On ne peut pas pousser à fond l'éducation politique et l'éducation
tout court de masses sans l'accompagner d'un développement
économique, culturel et social parallèle. »
   Romain Gary - "Les racines 
du ciel"
   |\  _,,,---,,_
   /,`.-'`'-.  ;-;;,_
  |,4-  ) )-,_. ,\ (  `'-'
 '---''(_/--'  `-'\_)   πr

perl -e '$_=q#: 3|\ 5_,3-3,2_: 3/,`.'"'"'`'"'"' 5-.  ;-;;,_:  |,A-  ) )-,_. ,\ 
(  `'"'"'-'"'"': '"'"'-3'"'"'2(_/--'"'"'  `-'"'"'\_): 
24πr::#;y#:#\n#;s#(\D)(\d+)#$1x$2#ge;print'
- --> Ce message n’engage que son auteur <--



signature.asc
Description: Message signed with OpenPGP


Récupérer le résultat d'une commande sed dans une variable ou un fichier : problème...

2021-11-03 Par sujet roger . tarani
Bonjour, 

Dans un script (bash 5.0.3(1), debian 10), je tente de récupérer le résultat 
d'une commande sed dans une variable. 

DOMAIN=http://toto.com/ 
sed '/^abc\|^$/! { p; s|^| -> '$DOMAIN'|g }' mon_fichier 

Dans la commande, le séparateur de la substitution est | car avec / il y a un 
conflit avec le / de la cariable DOMAIN 

J'ai tenté diverses expressions, comme par exemple dans une variable : 
RES=$( sed '/^abc\|^$/! { p; s|^| -> '$DOMAIN'|g }') 

ou en écrivant dans un fichier, avec une subsitution de commande ou sans : 
$(sed '/^abc\|^$/! { p; s|^| -> '"$DOMAIN"'|g }' "$RES" > mon_fichier) 

ou sans : 
$(sed '/^abc\|^$/! { p; s|^| -> '"$DOMAIN"'|g }' "$RES" > mon_fichier) 


Dans le script, je n'arrive pas du tout à obtenir le résultat escompté, tant 
via la variable que par le fichier : RIEN, même pas le résultat aplati/sans 
séparateur que j'obtiens en ligne de commande ci-dessous. 


En ligne de commande, j'obtiens exactement le résultat escompté sur stdout ou 
dans le fichier. 
foo 
bar 
baz 
truc 
machin 

TOUTEFOIS, il y a un indice pour la question posée. Quand je fais : 
echo $RES 

J'obtiens le résultat aplati, sans séparateur : 
foo bar baz truc machin 


J'ai écumé de nombreux forums où ce problème est soulevé. Sans trouver la clef. 

J'ai tenté de prende une valeur de DOMAIN sans / pour une expression de sed 
avec des / au lieu de | : idem. 

Quel mystère y a-t-il qui m'échapperait donc ? 
Je me dis qu'il y a une option de sed qui m'échappe ou une obscure histoire de 
contexte bash. 


Merci pour vos lumières/bougies/loupiotes ! 

Cordialement 
Roger