Retourner aux forums || Retourner au forum Programmation.shell

Programmation.shell : Sed ... je vais craquer

Posté par DjinnS (page perso, ) le 06 mai 2005
0
Bonjour

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

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.

lecture + écriture

Posté par Naha (page perso, ) le 06/05/2005 à 14:05. (lien). Évalué à 2.

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

  • [^]Re: lecture + écriture

    Posté par arno () le 06/05/2005 à 14:10. (lien). Évalué à 1.

    Sinon tu peus essayer en rajoutant l'option '-i' qui permet d'éditer les fichiers directement.

    • [^]Re: lecture + écriture

      Posté par arno () le 06/05/2005 à 14:12. (lien). Évalué à 1.

      Wouahlou, comment que je suis trops lent à écrire moi! :)

Ouai mais en fait non ....

Posté par DjinnS (page perso, ) le 06/05/2005 à 15:16. (lien). Évalué à 2.

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

Posté par Pascal (page perso, ) le 06/05/2005 à 23:47. (lien). Évalué à 2.

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