Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
une ligne qui fait c... le monde !!!!
Envoyé par: remi1

Bonjour, j'ai fait dernierement un petit script dans lequel j'effectue une lecture ligne a ligne d'un fichier, jusque là tout va bien.
Concretement :

cat /etc/profile | while read ligne
...

le probleme, c'est que dans le fichier, il y a une ligne qui contient des \ et la ligne correspondante retournées par le read est la même, mais sans les \.
Pour mon script, c'est vraiment très embettant !!!!

Je pourrais bien me débrouiller avec des tests et des grep et etc.... mais je tourne sur une petite machine et j'ai pas envie de doubler le temps d'execution du programme.

Est ce que quelqu'un a une idée ??

Merci

Poste le Wednesday 4 February 2004 21:36:17
Répondre     Citer    
Re: une ligne qui fait c... le monde !!!!
Envoyé par: Svear

Hum... j'avoue que ton problème est, pour moi, incongru. Je vais essayer de te donner diverses solutions mais je ne peux pas les vérifier car je ne toucherai pas à un Linux avant lundi (09/02)...
1)
je pense que les "\" sont anihilés par le shell qui exécute ton script. Tu peux alors "patcher" le pb (comme fait couremment micro$oft) en remplaçant tous les "\" par des "\\" avant la boucle de lecture, du style
sed -e "s/\\/\\\\" /etc/profile | while read ligne
...

2)
tu peux essayer une autre boucle de lecture en utilisant le "exec"

#!/bin/sh
exec 3 </etc/profile

while true
do
# Lecture du fichier dans une variable "lig"
read lig 0<&3

# Si la variable est vide, sortie de boucle
test –z "$lig" && break

# Traitement de "lig"
...
done

Poste le Thursday 5 February 2004 20:14:35
Répondre     Citer    
Re: une ligne qui fait c... le monde !!!!
Envoyé par: svear

Bon, j'ai fait des tests et j'ai ta solution !
1) Dans le message précédent, la solution n° 2 ne fonctionne pas, les "\" ne sont pas traités mais la n° 1 fonctionne avec une petite modification

Tu dois lire ton fichier en le passant à "sed" comme dans l'exemple suivant:
sed -e "s/\\\\/\\\\\\\\" /etc/profile | while read ligne
do
...
done

En fait, il faut que ton "read" recoive deux \ pour chaque \ de ta ligne. C'est ce que fait le "sed". Chaque fois qu'il verra un "\", il en renverra 2 !!!

Tout le problème était que ce script est filtré par le shell puis par le "sed" avant d'être traité. C'est pourquoi il a fallu mettre 4 \ pour que le "sed" en ait 2 et qu'il comprenne qu'il doit en traiter un. C'est un vrai problème en shell chaque fois qu'il faut traiter un "\", il faut en mettre un second pour qu'il annule l'effet du premier. Et plus tu as des interpréteurs entre ton script et ton traitement plus tu dois doubler le nombre de "\".
A+

Poste le Saturday 7 February 2004 15:27:07
Répondre     Citer    
Re: une ligne qui fait c... le monde !!!!
Envoyé par: remi1

Merci de ton aide, mais c'est bon, j'ai trouvé l'erreur. En fait, étant donné qu'il n y a pas de man pour la commande read, c'était assez dur, j'y suis aller à taton. En fait il suffit d'utiliser read avec l'option -r, ne me demande pas pourquoi, mais ca marche.

Voila, merci de ton aide

Poste le Saturday 7 February 2004 16:35:51
Répondre     Citer    
Re: une ligne qui fait c... le monde !!!!
Envoyé par: Svear

Ben tu vois, là c'est toi qui m'apprend quelque chose. Comme quoi, un forum c'est vraiment le pied !!!
A+

Poste le Monday 9 February 2004 16:00:27
Répondre     Citer    
Re: une ligne qui fait c... le monde !!!!
Envoyé par: Cyber.T@Z

salut


pour l'info l'option -r de read c'est raw c'est a dire une lecture brute sans interpretation des symbole speciaux comme \

désole du retard a l'allumage pour la reponse

Poste le Wednesday 11 February 2004 22:31:22
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
une ligne qui fait c... le monde !!!!
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons