• =?utf-8?Q?Re:_R=C3=A9cup=C3=A9rer_le_r=C3=A9sultat_d'une_commande_sed_?

    From roger.tarani@free.fr@21:1/5 to All on Thu Nov 4 14:50:01 2021
    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" <bernard.schoenacker@free.fr>
    À: "roger tarani" <roger.tarani@free.fr>
    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" <roger.tarani@free.fr>
    À: "Liste Debian" <debian-user-french@lists.debian.org>
    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





    <html><body><div style="font-family: arial, helvetica, sans-serif; font-size: 12pt; color: #000000"><div><style>/*<![CDATA[*/p {
    margin: 0;
    }

    [continued in next message]

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Bernard Schoenacker@21:1/5 to All on Thu Nov 4 16:20:01 2021
    ----- Mail original -----

    De: "roger tarani" <roger.tarani@free.fr>
    À: "Liste Debian" <debian-user-french@lists.debian.org>
    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

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From roger.tarani@free.fr@21:1/5 to All on Thu Nov 4 16:20:01 2021
    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" <plm@teledetection.fr>
    À: "roger tarani" <roger.tarani@free.fr>
    Cc: "Liste Debian" <debian-user-french@lists.debian.org>
    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.tarani@free.fr | roger.tarani@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 <--



    <html><body><div style="font-family: arial, helvetica, sans-serif; font-size: 12pt; color: #000000"><div>Bonjour,</div><div><br data-mce-bogus="1"></div><div>Bien compris&nbsp;en ce qui concerne les LF. Merci pour ce rappel utile (<span style="color: #
    000000; font-family: 'Courier New'; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start
  • From roger.tarani@free.fr@21:1/5 to All on Thu Nov 4 17:20:01 2021
    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" <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
    ")"

    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

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From roger.tarani@free.fr@21:1/5 to All on Thu Nov 4 22:00:02 2021
    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

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From roger.tarani@free.fr@21:1/5 to All on Fri Nov 5 00:40:02 2021
    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" <mc@unistra.fr>
    À: "roger tarani" <roger.tarani@free.fr>
    Cc: "Liste Debian" <debian-user-french@lists.debian.org>
    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

    <html><body><div style="font-family: arial, helvetica, sans-serif; font-size: 12pt; color: #000000"><div>Oui, en effet, je voulais faire ça : donner la valeur d'une variable à manger à sed.<br>Et je n'ai même pas de fichier mais une variable à
    traiter.<br>J'avais créé un fichier pour tenter de débloquer la situation avec une situation plus connue avec sed.<br><br>TRUC est fournie par un traitement précédent du script.</div><div>Et <span style="color: #000000; font-family: arial, helvetica,
    sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2;
    word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff; t
  • From roger.tarani@free.fr@21:1/5 to All on Thu Nov 11 01:00:01 2021
    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

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)