#1 Le 29/04/2018, à 15:04
- topiquette
[Résolu] Problème pour lire un caractère avec sed
Bonjour à tous
Je viens quérir votre aide sur un problème que je n'arrive pas à résoudre :
Je voudrais avec un sed modifier un caractère dans un fichier de conf par rapport au numéro renseigné mais malgré plusieurs essais de syntaxe je n'y arrive pas car qqchose doit m'échapper...
(pour changer le premier caractère il faut renseigner 0 mais ça pourrait aussi être le 1 si on enlève le second # de la recherche)
Le fichier de conf créé au début ressemble à çà :
#conf1#0000000000
#conf2#0000000000
etc
while :
do
clear
echo -e "Valeur de conf :"
echo -e "----------------"
cat script.conf
echo -e " "
read -p "Quel bit doit être changé ? " vBit
sed -i -e 's/^#conf1#\{$vBit\}0/^#conf1#\{$vBit\}1/' script.conf
done
Si qqun sait comment corriger le sed pour le rendre fonctionnel je le remercie d'avance
Dernière modification par topiquette (Le 29/04/2018, à 22:54)
Hors ligne
#2 Le 29/04/2018, à 15:23
- pingouinux
Re : [Résolu] Problème pour lire un caractère avec sed
Bonjour,
Si j'ai bien compris, essaye :
sed -i -re "s/^(#conf1#.{$vBit})(.|$)/\11/" script.conf
Hors ligne
#3 Le 29/04/2018, à 15:27
- topiquette
Re : [Résolu] Problème pour lire un caractère avec sed
Hello pingouinux,
ça marche, c'est génial !
Je vais tâcher de comprendre la solution maintenant.
Merci beaucoup ^^
Hors ligne
#4 Le 29/04/2018, à 17:39
- topiquette
Re : [Résolu] Problème pour lire un caractère avec sed
Rebonjour,
J'ai à nouveau un petit problème avec mon sed (qui ne vient peut-être pas du sed d'ailleurs) :
J'ai refais un script qui permet d'écrire dans mon fichier de conf sur plusieurs lignes et je voulais être en mesure d'aller chercher un caractère précis.
J'ai joué avec 2 boucles for histoire de tout afficher mais le résultat bien que correct avec les valeurs affiche des choses curieuses.
Le bout de script :
for vl in '#confA#' '#confB#'
do
echo -e "LIGNE $vl :"
for vi in `seq 0 9`;
do
vTest=`sed -re "s/^("$vl".{$vi})(.|$)/\2/" script.conf | cut -c1`
echo -e "Valeur du bit $vi : $vTest"
done
echo -e " "
done
Le résultat attendu était çà :
LIGNE #confA# :
Valeur du bit 0 : 0
Valeur du bit 1 : 0
Valeur du bit 2 : 0
Valeur du bit 3 : 0
Valeur du bit 4 : 0
Valeur du bit 5 : 1
Valeur du bit 6 : 0
Valeur du bit 7 : 0
Valeur du bit 8 : 1
Valeur du bit 9 : 0
LIGNE #confB# :
Valeur du bit 0 : 0
Valeur du bit 1 : 0
Valeur du bit 2 : 1
Valeur du bit 3 : 1
Valeur du bit 4 : 0
Valeur du bit 5 : 0
Valeur du bit 6 : 1
Valeur du bit 7 : 0
Valeur du bit 8 : 0
Valeur du bit 9 : 0
mais à la place il me fais çà :
LIGNE #confA# :
Valeur du bit 0 : 0
#
Valeur du bit 1 : 0
#
Valeur du bit 2 : 0
#
Valeur du bit 3 : 0
#
Valeur du bit 4 : 0
#
Valeur du bit 5 : 1
#
Valeur du bit 6 : 0
#
Valeur du bit 7 : 0
#
Valeur du bit 8 : 1
#
Valeur du bit 9 : 0
#
LIGNE #confB# :
Valeur du bit 0 : #
0
Valeur du bit 1 : #
0
Valeur du bit 2 : #
1
Valeur du bit 3 : #
1
Valeur du bit 4 : #
0
Valeur du bit 5 : #
0
Valeur du bit 6 : #
1
Valeur du bit 7 : #
0
Valeur du bit 8 : #
0
Valeur du bit 9 : #
0
Si qqun a une idée d'où vient l'erreur je suis preneur.
Modération : merci d'utiliser les balises code (explications ici).
Dernière modification par cqfd93 (Le 29/04/2018, à 17:53)
Hors ligne
#5 Le 29/04/2018, à 22:26
- pingouinux
Re : [Résolu] Problème pour lire un caractère avec sed
Tu peux déjà remplacer
vTest=`sed -re "s/^("$vl".{$vi})(.|$)/\2/" script.conf | cut -c1`
par
vTest=$(sed -rne "s/^"$vl".{$vi}(.).*/\1/p" script.conf)
Hors ligne
#6 Le 29/04/2018, à 22:53
- topiquette
Re : [Résolu] Problème pour lire un caractère avec sed
Rebonjour pingouinux,
Tu es mon héros du jour, ça fonctionne parfaitement avec ta version !
Ma version fonctionnait tant qu'il n'y avait qu'une seule ligne dans le fichier mais il devait déjà y avoir un problème latent.
Encore un grand merci à toi
Hors ligne
#7 Le 29/04/2018, à 23:12
- pingouinux
Re : [Résolu] Problème pour lire un caractère avec sed
Tu peux aussi faire ceci
for vl in '#conf1#' '#conf2#' '#conf3#'
do
echo -e "LIGNE $vl :"
vi=0
while read -n1 vTest
do
[ "$vTest" ] && echo -e "Valeur du bit $((vi++)) : $vTest"
done < <(grep -oP "(?<=^$vl)\d+" script.conf)
echo
done
Édité : Correction du nom du fichier
Dernière modification par pingouinux (Le 30/04/2018, à 06:53)
Hors ligne
#8 Le 29/04/2018, à 23:24
- topiquette
Re : [Résolu] Problème pour lire un caractère avec sed
Excellent, merci !
ça va me faire un nouveau truc à potasser et des choses à apprendre
Hors ligne
#9 Le 30/04/2018, à 05:59
- pingouinux
Re : [Résolu] Problème pour lire un caractère avec sed
Ma version fonctionnait tant qu'il n'y avait qu'une seule ligne dans le fichier mais il devait déjà y avoir un problème latent.
En fait, tu traitais toutes les lignes du fichier d'entrée pour chaque valeur de #conf?#.
vTest=$(sed -rne "s/^"$vl".{$vi}(.).*/\1/p" script.conf)
-n : Pour ne pas sortir toutes les lignes
p : Pour sortir la ou les lignes modifiées
Édité :
Et en ne lisant qu'une seule fois le fichier de départ
while read lig
do
vl=$(awk -F# '{print $2}' <<<"$lig")
echo -e "LIGNE #$vl# :"
vi=0
while read -n1 vTest
do
[ "$vTest" ] && echo -e "Valeur du bit $((vi++)) : $vTest"
done < <(awk -F# '{print $3}' <<<"$lig")
echo
done < <(grep -P '^#conf\d+#' script.conf)
Remarque : python serait bien adapté à ce genre de traitement
Dernière modification par pingouinux (Le 30/04/2018, à 07:57)
Hors ligne
#10 Le 30/04/2018, à 19:15
- topiquette
Re : [Résolu] Problème pour lire un caractère avec sed
Là tu m'as perdu avec le dernier message mais je note tout ça car awk fait aussi partie de ma "liste de courses" (je ne l'ai utilisé qu'une fois dans la douleur pour me rendre compte le lendemain qu'une simple commande faisait la même que ma super ligne de champion )
Je compte bien jeter un oeil à python et perl mais m'y étant mis il y a à peine 1 mois j'essaye déjà de choper des bases un minimum solide en bash.
En tout cas, merci pour ces informations supplémentaires
Hors ligne