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 09/07/2012, à 11:28

Le Goss

[Résolu] Bash sed insersion après saisie de variables

Bonjour à tous,

J'ai pense avoir pigé comment insérer du texte en fin d'un fichier:

sed -i '$a \texte en fin de fichier' fichier

En revanche, je n'arrive pas à faire de même si le fragment à insérer contient des variables.
Je précise ce que je souhaite obtenir. J'ai une floppée de commandes en LaTeX à saisir de la forme
\commande{variable1}{variable2}{variable3}{variable4}
Mon code bash

#!/bin/bash
read -p "insérer variable a : " vara
read -p "insérer variable b : " varb
read -p "insérer variable c : " varc
read -p "insérer variable d : " vard
sed -i '$a \\\commande{$vara}{$varb}{$varc}{$vard}' fichier

Quand je saisis mes variables, l'insersion donne:

\commande{$vara}{$varb}{$varc}{$vard}

Si je remplace la dernière ligne par

sed -i "$a \\\commande{$vara}{$varb}{$varc}{$vard}" fichier

la console me retourne

sed: -e expression n°1, caractère 27: expression régulière d'adresse inachevée

J'ai essayé d'autres choses encore; aussi peu concluantes...
Merci pour votre aide !
Cordialement

Dernière modification par Le Goss (Le 14/07/2012, à 18:48)


Si je pose une question sur le forum, ce n'est pas par paresse ou pour faire faire "mes devoirs"; c'est par ignorance: j'ai 51 berges. Et, par principe, je préfère être traité d'ignare que de fainéant.
Samsung i7-3630QM CPU @ 2.40GHz × 8 - 64 bits - RAM 7,7 Gio - DD 976 Go - Bodhi 6.0.0 Ubuntu 20.04
Allergique au wysiwyg; traitement à vie: Lilypond - LaTeX - txt2tags

Hors ligne

#2 Le 09/07/2012, à 11:47

miniSeb

Re : [Résolu] Bash sed insersion après saisie de variables

Si c'est pour insérer en fin de fichier, pas la peine de passer par sed :

echo "\commande{$vara}{$varb}{$varc}{$vard}" >> fichier

devrait faire l'affaire wink

Dernière modification par miniSeb (Le 09/07/2012, à 11:49)

Hors ligne

#3 Le 09/07/2012, à 11:54

Le Goss

Re : [Résolu] Bash sed insersion après saisie de variables

Impec !
Merci beaucoup
Sans vouloir abuser... un petite question subsidiaire :
j'ai pas mal de commandes à saisir. Est-ce qu'il est possible de faire tourner le script en bouche le temps de tout saisir et de l'arrêter quand c'est fini ?


Si je pose une question sur le forum, ce n'est pas par paresse ou pour faire faire "mes devoirs"; c'est par ignorance: j'ai 51 berges. Et, par principe, je préfère être traité d'ignare que de fainéant.
Samsung i7-3630QM CPU @ 2.40GHz × 8 - 64 bits - RAM 7,7 Gio - DD 976 Go - Bodhi 6.0.0 Ubuntu 20.04
Allergique au wysiwyg; traitement à vie: Lilypond - LaTeX - txt2tags

Hors ligne

#4 Le 09/07/2012, à 12:09

miniSeb

Re : [Résolu] Bash sed insersion après saisie de variables

Je ne code pas en bash... Solution fonctionnelle mais hideuse pour dépanner :

#!/bin/bash                                                                                                                   
while (true)
do
read -p "insérer variable a : " vara
read -p "insérer variable b : " varb
read -p "insérer variable c : " varc
read -p "insérer variable d : " vard
echo "\commande{$vara}{$varb}{$varc}{$vard}" >> fichier
done

Et tu quittes avec ctrl-c.

Par contre faudra vraiment trouver une solution plus propre, là c'est du bidouillage neutral

Hors ligne

#5 Le 09/07/2012, à 19:31

nesthib

Re : [Résolu] Bash sed insersion après saisie de variables

pour quelque chose d'aussi trivial je trouve ça suffisamment propre, tu peux juste ne faire qu'un seul read, ça sera plus simple :

while true
do
 read -p "variables séparées par des espaces : " varA varB varC varD other
 echo "\commande{$varA}{$varB}{$varC}{$varD}" >> fichier
done

NB. en bonus, pour ajouter une ligne avec sed il fallait faire :

sed -i '${s/$/\nnouvelle ligne/}' fichier

(mais la solution echo … >>fichier est meilleure)


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#6 Le 09/07/2012, à 20:41

pingouinux

Re : [Résolu] Bash sed insersion après saisie de variables

Salut,
On peut aussi adapter cette commande de Le Goss #1 qui ne fonctionnait pas :

sed -i "$a \\\commande{$vara}{$varb}{$varc}{$vard}" fichier

en la remplaçant par celle-ci :

sed -i "\$a \\\\\commande{$vara}{$varb}{$varc}{$vard}" fichier

C'est assez lourdingue, et les autres solutions proposées sont plus élégantes.

Hors ligne

#7 Le 09/07/2012, à 23:14

Le Goss

Re : [Résolu] Bash sed insersion après saisie de variables

peut-être pas élégant... mais ça marche ! wink
@nesthib: je note ta boucle et la possibilité de saisir les variables sur une même ligne. Je trouve le procédé plus pratique en cas d'erreur. Sauf que si la varA ou varB par exemple ne contiennent aucune donnée, je ne sais pas comment le signifier. Y a-t-il une astuce ?
Ah, j'oubliais, sur la ligne

read -p "variables séparées par des espaces : " varA varB varC varD other

A quoi sert "other" ?


Si je pose une question sur le forum, ce n'est pas par paresse ou pour faire faire "mes devoirs"; c'est par ignorance: j'ai 51 berges. Et, par principe, je préfère être traité d'ignare que de fainéant.
Samsung i7-3630QM CPU @ 2.40GHz × 8 - 64 bits - RAM 7,7 Gio - DD 976 Go - Bodhi 6.0.0 Ubuntu 20.04
Allergique au wysiwyg; traitement à vie: Lilypond - LaTeX - txt2tags

Hors ligne

#8 Le 10/07/2012, à 00:09

nesthib

Re : [Résolu] Bash sed insersion après saisie de variables

alors pour vérifier si varA ou varB ne contiennent pas de données tu peux faire un test :

[[ $varA == "" ]] && faire quelque chose

ou

if [[ $varA == "" ]]
then
  faire quelque chose
fi

pour le other, j'avoue que j'attendais que quelqu'un pose la question tongue
En fait read lit des mots séparés pas un séparateur (par défaut un espace) et les mets au fur et à mesure dans les variables. S'il n'y a plus de mots les variables restantes seront vides. S'il y a trop de mots, la dernière variable récupère le reste de la chaîne. Ainsi si tu as 5 mots, sans la variable other, varD récupérerait "mot4 mot5". L'ajout de other est une astuce pour éviter ce désagrément et être sûr que la dernière variable que l'on va utiliser contienne au maximum un seul et unique mot. smile


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#9 Le 10/07/2012, à 05:54

pingouinux

Re : [Résolu] Bash sed insersion après saisie de variables

Le Goss #7 a écrit :

Sauf que si la varA ou varB par exemple ne contiennent aucune donnée, je ne sais pas comment le signifier. Y a-t-il une astuce ?

Pour pouvoir donner une chaîne vide, il faut changer le séparateur :

$ IFS=- read -p "variables séparées par des tirets : " varA varB varC varD other
variables séparées par des tirets : A--C-D

$ echo =$varA=$varB=$varC=$varD=
=A==C=D=

Hors ligne

#10 Le 10/07/2012, à 06:47

nesthib

Re : [Résolu] Bash sed insersion après saisie de variables

oh… j'avais mal compris la question, bien vu pingouinux !
si tu veux garder les espaces tu peux aussi faire :

$ read varA varB varC varD other
a \  c d
$ echo "$varA $varB $varC $varD"
a   c d
$ echo $varA $varB $varC $varD
a c d

note bien les deux espaces après le « \ » et la différence entre l'expansion des variables avec et sans guillemets


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#11 Le 10/07/2012, à 06:53

pingouinux

Re : [Résolu] Bash sed insersion après saisie de variables

@nesthib #10 : Exact. J'avais essayé avec une chaîne vide "", mais il mettait les guillemets dans la variable.

Hors ligne

#12 Le 10/07/2012, à 07:00

nesthib

Re : [Résolu] Bash sed insersion après saisie de variables

oui read ne fait pas d'échappement shell, il se contente de lire du texte brut


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#13 Le 14/07/2012, à 18:47

Le Goss

Re : [Résolu] Bash sed insersion après saisie de variables

Bon ben, il y a matière.
Problème résolu !
Merci à tous pour votre aide


Si je pose une question sur le forum, ce n'est pas par paresse ou pour faire faire "mes devoirs"; c'est par ignorance: j'ai 51 berges. Et, par principe, je préfère être traité d'ignare que de fainéant.
Samsung i7-3630QM CPU @ 2.40GHz × 8 - 64 bits - RAM 7,7 Gio - DD 976 Go - Bodhi 6.0.0 Ubuntu 20.04
Allergique au wysiwyg; traitement à vie: Lilypond - LaTeX - txt2tags

Hors ligne