Retourner aux forums || Retourner au forum Programmation.shell
voila j'ai ma petite ligne sed qui est:
sed -e s/[hs]d[a-z]/${INSTALL_DISK}/g ${TARGET}/etc/lilo.conf
elle fonctionne bien, pas de problemes, je vois bien la modif sur mon écran (j'ose pas dire la sortie standard pour ce qui suit ...).
C'est bien jolie d'avoir la modificaition qui s'affiche à l'écran mais j'aimerais bien l'envoyer vers ${TARGET}/etc/lilo.conf. Donc je fais un:
sed -e s/[hs]d[a-z]/${INSTALL_DISK}/g ${TARGET}/etc/lilo.conf > ${TARGET}/etc/lilo.conf
Et la c'est le drame, plus rien dans ${TARGET}/etc/lilo.conf ... le fichier est vide ! Si jamais je fais un >> la ca marche, mais c'est un ajout ... donc j'ai l'ancienne config :) J'ai essayé &> mais non plus, ce n'est pas la sortie de erreurs ...
J'ai bien tenté de mettre tout ca dans une variable avec un modConf="`....`." mais je n'ai plus les retours à la ligne ...
Rien dans le man de sed ...
Je craque, deux heures que je suis dessus ce petit détail qui m'empeche d'avance.
Quelqu'un aurait-il une idée ? Pourquoi je ne peux pas récupérer ma sortie standard de sed ?!!!
Merci d'avance :/
> Lire le message (13 commentaires, moyenne: 2,2).
lecture + écriture
Le problème est que tu lis dans ${TARGET}/etc/lilo.conf et que tu écris dans le même fichier.
La bonne solution est (je pense) :
sed -e s/[hs]d[a-z]/${INSTALL_DISK}/g ${TARGET}/etc/lilo.conf > ${TARGET}/etc/lilo.conf2
mv ${TARGET}/etc/lilo.conf2 ${TARGET}/etc/lilo.conf
-
[^]man sed
Posté par Damien POBEL (page perso, ) le 06/05/2005 à 14:07. (lien). Évalué à 2.sed -ie s/[hs]d[a-z]/${INSTALL_DISK}/g ${TARGET}/etc/lilo.conf > ${TARGET}/etc/lilo.conf
note le -i (in-place).-
[^]Re: man sed
Posté par DjinnS (page perso, ) le 06/05/2005 à 14:10. (lien). Évalué à 2.Ok ok je relirais le man 5 fois ce soir pour avoir raté cette option !!
Merci ca marche nikel aussi ;)
-
[^]Re: man sed
Posté par tgl () le 06/05/2005 à 14:48. (lien). Évalué à 4.À noter que -i est une option introduite par la version 4 de sed. Bon, on s'en fout... presque en fait, je le précise juste au cas où DjinnS aurait été sous Debian stable.
(Erf, désolé, mais le troll Debian étant à l'agonie, il faut bien en profiter tant qu'il est encore tiède...)-
[^]Re: man sed
Posté par DjinnS (page perso, ) le 06/05/2005 à 15:04. (lien). Évalué à 2.Merci mais ca va, je suis en unstable :)
Un troll où ca ?
Il existe d'autre distrib que la Debian ? :p
-
-
-
[^]Re: lecture + écriture
Posté par DjinnS (page perso, ) le 06/05/2005 à 14:08. (lien). Évalué à 2.Hum ....
MERCI !!!!!
Effectivement ca pose probleme, pourtant en général ca marche ... j'imaginais que le fichier était laché par sed mais il doit continuer de l'utiliser sans doute enfin je sais pas.
Merci en tout cas :)
Ouai mais en fait non ....
L'option -i ne marche pas.
Je montre:
pan:/work# echo $TARGET
/work/bordel/tar
pan:/work# echo $INSTALL_DISK
jkl
pan:/work# ll bordel/tar/etc/lilo*
-rw-r----- 1 root root 442 2005-05-06 11:59 bordel/tar/etc/lilo.conf
-rw-r----- 1 root root 4,1K 2005-04-12 16:29 bordel/tar/etc/lilo.conf.bak
pan:/work# cat bordel/tar/etc/lilo.conf
# lilo.conf
#
# version: 1.0
#
# Modif: Guillaume L.
#
# Oxalide
#
# options
vga=normal
lba32
append="console=tty0"
# bootsplash
#bitmap=/boot/oxalide.bmp
#bmp-colors=0,,4,15,,4
#bmp-table=240p,190p,1,9,17
#bmp-timer=300p,354p,0,15,0
install=/boot/boot-menu.b
# timeout et prompt
prompt
timeout=500
delay=500
# boot
default=Linux
boot=/dev/jkl
root=/dev/jkl1
map=/boot/map
# kernels
image=/vmlinuz vga=791
label=Linux
read-only
Donc ok, base saine ... ensuite:
pan:/work# sed -ie "s/[hs]d[a-z]/${INSTALL_DISK}/g" ${TARGET}/etc/lilo.conf > ${TARGET}/etc/lilo.conf
pan:/work# cat bordel/tar/etc/lilo.conf
pan:/work# ll bordel/tar/etc/lilo*
-rw-r----- 1 root root 0 2005-05-06 12:00 bordel/tar/etc/lilo.conf
-rw-r----- 1 root root 4,1K 2005-04-12 16:29 bordel/tar/etc/lilo.conf.bak
-rw-r----- 1 root root 0 2005-05-06 12:00 bordel/tar/etc/lilo.confe
Donc résultat:
- plus rien dans lilo.conf
- un fichier lilo.confe qui apparait (même si je suis du sud, mon kernel lui ne l'est pas !!!)
- j'y comprends plus rien
Précision:
pan:/work# sed --version
GNU sed version 4.1.2
Copyright (C) 2003 Free Software Foundation, Inc.
Ce logiciel est libre; voir les sources pour les conditions de reproduction.
AUCUNE garantie n'est donnée; y compris pour des RAISONS COMMERCIALES ou
pour RÉPONDRE A UN BESOIN PARTICULIER, à l'étendue permise par la loi.
Où est la cocille ?!
-
[^]Re: Ouai mais en fait non ....
Posté par Naha (page perso, ) le 06/05/2005 à 15:31. (lien). Évalué à 1.Et que contient le fichier lilo.confe ?
Sinon essaye ma méthode ;-) (d'ailleurs je ne connaissais pas cette option -i, il faudra que j'essaye).-
[^]Re: Ouai mais en fait non ....
Posté par DjinnS (page perso, ) le 06/05/2005 à 15:32. (lien). Évalué à 2.Bah il est vide, il fait 0 octets :)
Oui, le mv me semble la qd meme plus simple :)-
[^]Re: Ouai mais en fait non ....
Posté par Didier (page perso, ) le 06/05/2005 à 15:58. (lien). Évalué à 6.Bah il est vide, il fait 0 octets :)
C'est tout à fait logique ;) Je m'explique :
L'option -i signifie selon le man :
-i[suffix], --in-place[=suffix]
edit files in place (makes backup if extension supplied)
L'option -i te permet donc de modifier le contenu du fichier passé en argument. Tu as le choix de modifier l'original sans sauvegarder le fichier original (pas de suffixe) ou bien de sauvegarder le fichier original sous un nouveau nom (nom du fichier original + suffixe).
Reprenons la commande que tu as utilisé :
sed -ie "s/[hs]d[a-z]/${INSTALL_DISK}/g" ${TARGET}/etc/lilo.conf > ${TARGET}/etc/lilo.conf
Tu passes à l'option -i une valeur : « e ». La commande sed doit donc modifier le fichier original, mais en conserver une copie dans ${TARGET}/etc/lilo.confe (avec le suffix « e » !). L'option -e n'est pas spécifiée (le « e » est compris comme étant la valeur de l'option -i). Ensuite, ton problème de fichier vide est le même que précédemment : tu lis et tu écris dans le même fichier en même temps.
La bonne commande si tu ne veux pas de sauvegarde est la suivante :
sed -i -e "s/[hs]d[a-z]/${INSTALL_DISK}/g" ${TARGET}/etc/lilo.conf
La même, mais avec sauvegarde (on n'est jamais trop prudent) :
sed -i ".bak" -e "s/[hs]d[a-z]/${INSTALL_DISK}/g" ${TARGET}/etc/lilo.conf
Voilà ;)
-
-
Cette erreur est très classique
C'est une erreur très classique....
Tout les dévellopeurs shell la font toujours une fois....
Il ne faut pas oublier que Linux est un système multitache, et le shell se sert de cela.
Regardons un peu comment fonctionne un shell pour comprendre me problème:
Lorsque tu fais
sed "......" lilo.conf > lilo.conf.
Comment interprete le shell interprète t-il cela.
Pour lui, cela veut dire: lance le programme sed avec ses arguments et mets le contenu de sa sortie standart dans lilo.conf.
Que ce passe t-il dans l'ordre chronologique:
- Le shell crée un processus, se connecte à lui avec un tube unix pour récupérer sa sortie.
- Le processus nouvellement créé lance sed avec ses arguments. Sed ouvre alors en lecture le fichier lilo.conf.
- En même temps (système multitache), le shell ouvre le fichier lilo.conf en ecriture pour pouvoir y écrire le résultat de la commande. Mais à cause du symbole '>', il efface d'abord son contenu.
- En même temps, sed essaye de lire le contenu de lilo.conf qui est maintenant vide, il ne renvoit donc rien sur sa sortie standard. Le contenu de lilo.conf est perdu.......
J'espère que j'ai été clair dans mes explications. Ce genre de trucs se produit quand on essaye de réaliser des modifications sur des fichiers avec sed, cut ....
Il y a plusieurs solutions au problème comme il a été dit un peu plus tot:
- utilser un fichier temporaire: c'est le plus simple et ce qu'on fait le plus souvent:
- utiliser l'option de -i de sed qui permet de faire l'edition du fichier sur place, et donc sans utiliser la redirection du shell. Mais cela ne fonctionne uniquement si tu utilises sed.
Revenir en haut de page || Retourner aux forums || Retourner au forum Programmation.shell



Cette discussion est archivée, il n'est plus possible de laisser des commentaires.
Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.