Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 07/12/2017, à 16:38

DonutMan75

[RESOLU] Utilisation de sed pour remplir un template

Bonjour à tous,
voilà j'ai un fichier texte "template" que je souhaite remplir avec des variables.. Je cherche une façon plus propre de procéder que le pipe de N sed consécutifs...

Voici un exemple de template :

$ cat template.txt
nom : :MON_NOM:
age : :MON_AGE:
taille : :MA_TAILLE:
...

J'utilise donc sed au sein d'un script, de cette façon :

$ cat template.txt | sed -re "s/:MON_NOM:/$(my_name)/" | sed -re "s/:MON_AGE:/$(my_age)/" | sed -re "s/:MA_TAILLE:/$(my_heigh)/" | ... > fichier_rempli.txt

Ca marche bien mais ce n'est pas très beau (surtout que le nombre de champ à remplacer sera à terme de l'ordre de la dizaine...).

Bref, avez-vous une idée pour enjoliver un peu ça ?

J'ai pensé à plusieurs pistes, sans trop savoir ce qui serait vraiment optimal :

1) Créer deux tableaux, pattern et valeur, et utiliser une boucle for : tentant mais il faut aussi gérer les sorties intermédiaires
2) J'ai cru comprendre qu'on pouvait passer un script à sed, plutôt que d'utiliser l'option -e : pas mal mais dans ce cas, mes variables ${my_name} etc... ne seront pas définies ??
3) Utiliser des étiquettes ? Je ne suis pas sûr que ça fonctionne bien... Quelque chose comme :

$ cat template.txt | sed << FIN
s/:MON_NOM:/$(my_name)/
s/:MON_AGE:/$(my_age)/
s/:MA_TAILLE:/$(my_heigh)/
...
FIN

4) Utiliser les étiquettes SANS sed, on aurait in fine la commande ci-dessous. J'ai testé et ça marche.. Le problème c'est que le template est incorporé dans le script... Bof si je trouve rien de mieux je resterai là dessus, je pense...

cat > fichier_rempli.txt << FIN
nom : $my_name
age : $my_age
taille : $my_heigh
...
FIN

Qu'en dites-vous ?

Merci d'avance smile

Donut

Dernière modification par DonutMan75 (Le 08/12/2017, à 08:19)

Hors ligne

#2 Le 07/12/2017, à 17:42

Compte anonymisé

Re : [RESOLU] Utilisation de sed pour remplir un template

Bonjour,

cat template.txt | sed -re "s/:MON_NOM:/$(my_name)/" | sed -re "s/:MON_AGE:/$(my_age)/" | sed -re "s/:MA_TAILLE:/$(my_heigh)/" | ... > fichier_rempli.txt

=

sed -re "s/:MON_NOM:/$(my_name)/;s/:MON_AGE:/$(my_age)/;s/:MA_TAILLE:/$(my_heigh)/" template.txt > fichier_rempli.txt

le -re est aussi optionnel en l'état
les variables sont sous la forme $my_name et pas $(my_name) avec bash, là ça marchera pas

Bon il y a plus optimal comme façon de faire ... je vais y réfléchir wink

Dernière modification par Compte anonymisé (Le 07/12/2017, à 17:42)

#3 Le 07/12/2017, à 17:51

pingouinux

Re : [RESOLU] Utilisation de sed pour remplir un template

Bonjour,
Voici une façon de faire :

sed -re "
s/:MON_NOM:/${my_name}/
s/:MON_AGE:/${my_age}/
s/:MA_TAILLE:/${my_heigh}/
" template.txt >fichier_rempli.txt

Tu peux générer le script précédent avec celui-ci

$ cat generation_script 
printf 'sed -re "\n'
while [ "$1" ]
do
   printf 's/:%s:/${%s}/\n' "$1" "$2"
   shift 2
done
printf '" template.txt >fichier_rempli.txt\n'

que tu appelles ainsi

./generation_script MON_NOM my_name MON_AGE my_age MA_TAILLE my_heigh

Hors ligne

#4 Le 07/12/2017, à 18:55

DonutMan75

Re : [RESOLU] Utilisation de sed pour remplir un template

Hello,
super merci beaucoup à vous deux !
Je vais implémenter ça.

Bonne soirée,

Donut

Hors ligne

#5 Le 07/12/2017, à 19:17

Hizoka

Re : [RESOLU] Utilisation de sed pour remplir un template

et pourquoi ne pas réecrire un fichier via un simple echo si tu as toutes les variables ?


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#6 Le 08/12/2017, à 08:36

DonutMan75

Re : [RESOLU] Utilisation de sed pour remplir un template

Hello Hizoka,
merci pour ta proposition,
mais au final j'ai préféré garder un template externe au script.

Bonne journée à tous smile

Donut

Hors ligne