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" <[email protected]> 
À: "roger tarani" <[email protected]> 
Cc: "Liste Debian" <[email protected]> 
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:[email protected] | [email protected] ] 
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 <-- 


Répondre à