Forum Programmation.shell Sed ... je vais craquer

Posté par  .
Étiquettes : aucune
0
6
mai
2005
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 :/
  • # lecture + écriture

    Posté par  (site web personnel) . É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  (site web personnel) . É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).

      https://damien.pobel.fr

      • [^] # Re: man sed

        Posté par  . É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  . É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  . É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  . É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  . Évalué à 1.

      Sinon tu peus essayer en rajoutant l'option '-i' qui permet d'éditer les fichiers directement.
  • # Ouai mais en fait non ....

    Posté par  . É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  (site web personnel) . É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  . É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  (site web personnel) . É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  . É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.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.