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 29/04/2018, à 15:04

topiquette

[Résolu] Problème pour lire un caractère avec sed

Bonjour à tous big_smile

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 tongue

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 big_smile

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 cool

Hors ligne

#9 Le 30/04/2018, à 05:59

pingouinux

Re : [Résolu] Problème pour lire un caractère avec sed

topiquette #6 a écrit :

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 lol )

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 wink

Hors ligne