#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
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
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 : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde 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 !
@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
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.
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde 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
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 : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde 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 : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde 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