Re: Récupérer le résultat d'une commande sed dans une variable ou un fichier : problème...
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...
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...
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...
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...
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...
> $ 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...
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...
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...
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...
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...
- 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...
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...
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...
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...
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