Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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
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
")"
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
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
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
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
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
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é)
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" <mc@unistra.fr>
À: "roger tarani" <roger.tarani@free.fr>
Cc: "Liste Debian" <debian-user-french@lists.debian.org>
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
")"
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
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
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
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, 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
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
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
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, 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
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
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)
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
$ 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
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.
Le Fri, Nov 05, 2021 at 12:31:13AM +0100, 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
Le Fri, Nov 05, 2021 at 12:31:13AM +0100, roger.tarani@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
Le Fri, Nov 05, 2021 at 12:31:13AM +0100, 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
Marc Chantreux
salut, Le Fri, Nov 05, 2021 at 12:31:13AM +0100, 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
salut,
Le Fri, Nov 05, 2021 at 12:31:13AM +0100, roger.tarani@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
salut, Le Fri, Nov 05, 2021 at 12:31:13AM +0100, 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
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, 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
Bonsoir,
Merci pour ces précisions.
----- Mail original -----
De: "Marc Chantreux" <mc@unistra.fr>
À: "roger tarani" <roger.tarani@free.fr>
Cc: "Liste Debian" <debian-user-french@lists.debian.org>
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.tarani@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
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, 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
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, 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
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" <plessy@debian.org>
À: "Liste Debian" <debian-user-french@lists.debian.org>
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.tarani@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
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, 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