Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Besoin d'aide pour trouver/remplacer des éléments dans un fichier


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Besoin d'aide pour trouver/remplacer des éléments dans un fichier
    Bonjour et bonne année à tous,
    Dans le cadre d'un projet en shell pour mon école d'info,
    j'ai besoin d'utiliser une fonction trouver/remplacer (que j’exécuterais sur un fichier dans mon script shell sur un fichier) qui me permettrait de faire la chose suivante :
    ps: j'ai tester avec sed, tr et awk mais je n'y suis pas parvenu et la je bloque totalement.

    -remplacer tout les "\nthen" en "; then" afin de mettre à la ligne précedente le then

    donc ceci :

    Code bash :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/bin/sh
    # useless script
    device0="/dev/sda2"
    if [ -b "$device0" ]
    then
    echo "$device0 is a block device."
    fi


    en cela :

    Code bash :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/sh
    # useless script
    device0="/dev/sda2"
    if [ -b "$device0" ]; then
    echo "$device0 is a block device."
    fi


    Merci d'avance pour vos réponse

  2. #2
    Expert éminent sénior
    Bonjour

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    sed -z 's/\n[[:space:]]*then/\;then/g'


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ echo -e "blablabla \nthen blablabla \n\tthen blablabla \n   then blablabla"
    blablabla
    then blablabla
            then blablabla
       then blablabla


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    $ echo -e "blablabla \nthen blablabla \n\tthen blablabla \n   then blablabla"|sed -z 's/\n[[:space:]]*then/\;then/g'
    blablabla ;then blablabla ;then blablabla ;then blablabla
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Modérateur

    moi, je voudrais savoir pourquoi faire cette modification i nu tile.
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  4. #4
    Membre à l'essai
    Citation Envoyé par N_BaH Voir le message
    moi, je voudrais savoir pourquoi faire cette modification i nu tile.
    Tout simplement car le but du projet est de formatter des scripts bash avec une norme spécifique

  5. #5
    Modérateur

    c'est moche.

    par contre, tu pourrais indenter le code. Ça c'est joli, et utile pour améliorer la lisibilité.
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  6. #6
    Membre à l'essai
    Citation Envoyé par N_BaH Voir le message
    c'est moche.

    par contre, tu pourrais indenter le code. Ça c'est joli, et utile pour améliorer la lisibilité.
    Tu n'as visiblement pas correctement lu mon premier message

  7. #7
    Expert éminent sénior
    N_BaH a raison. Il faut respecter le langage dans le fond et dans la forme. Tu n'es pas en train de faire du c++. Ni du html. Et heureusement, pas du python.

    Le code suivant ne provoque pas d'erreur. Alors que si tu mets un point-virgule après l'esperluette, tu provoqueras une erreur.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if sleep 10 & 
    then 
            echo ok 
    else
            echo ko
    fi
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  8. #8
    Expert éminent sénior
    Si on laisse bash formater lui même, que dirait-il ?
    Pour le voir, il suffit de créer une fonction, avec le bout de code que l'on veut formater:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ func1(){
    device0="/dev/sda2"
    if [ -b "$device0" ]
    then
    echo "$device0 is a block device."
    fi
    }

    Et maintenant, demandons à bash:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ type func1
    func1 est une fonction
    func1 () 
    { 
        device0="/dev/sda2";
        if [ -b "$device0" ]; then
            echo "$device0 is a block device.";
        fi
    }

    et pour l'exemple de Flodelarab:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ func2(){
    if sleep 10 & 
    then 
            echo ok 
    else
            echo ko
    fi
    }
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ type func2
    func2 est une fonction
    func2 () 
    { 
        if sleep 10 & then
            echo ok;
        else
            echo ko;
        fi
    }


    PS: bizarre, il m'avait semblé avoir posté ce genre de message plus tôt mais celui-ci à disparu...
    Cordialement.

  9. #9
    Modérateur

    ce n'est pas moins moche.
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  10. #10
    Expert éminent sénior
    ???
    Cordialement.

  11. #11
    Expert éminent sénior
    Tiens donc. Amusant de voir le comportement de la commande type.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ type func3
    func3 est une fonction
    func3 ()
    {
        if echo zozo;
        sleep 2 & then
            echo ok;
        else
            echo ko;
        fi
    }

    Notez la présence d'un point-virgule inutile. Pourtant, il n'a pas tout mis sur une ligne pour autant.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ type func4
    func4 est une fonction
    func4 ()
    {
        if sleep 3 & sleep 2 & then
            echo ok;
        else
            echo ko;
        fi
    }
    Là, il met tout sur une ligne.
    "Bizarre" ? Vous avez dit "bizarre" ? Comme c'est bizarre !
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  12. #12
    Expert éminent sénior
    Oui, mais comment lui reprocher ça, en principe, la syntaxe qu'il montre fait partie de son interprétation...
    Ce qui suit est de la pur supposition (je n'ai pas été voir le code) :
    -On crée une fonction:
    L’interpréteur la met dans son tas dédié aux fonctions mais déjà disons précompilée (en tout cas déjà analysé, puisqu'il nous crache les erreurs de syntaxe) :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    $ func2(){ if sleep 10 &          echo ok ; else         echo ko; fi; }
    bash: erreur de syntaxe près du symbole inattendu « else »

    Pas mis de 'then' volontairement
    Et donc, ensuite, quand on lui demande le listing de la fonction, celui-ci la "décompile" de son tas et nous la présente formaté tel que lui l'avait interprété.

    Même si je n'approuve pas sa présentation, dans le principe, elle est censée être la référence, non ?
    Cordialement.

  13. #13
    Modérateur

    j'ai envoyé ds signaux de fumées au grand manitou. Il a répondu que ça n'a pas d'importance.
    j'en déduis que ce ne serait que du formatage, probablement lié aux goûts ou aux habitudes des programmeurs.
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  14. #14
    Expert éminent sénior
    Dommage que l'on n'a pas une petite norme officielle de formatage de shell...

    PS: se serait bien que l'on ne puisse faire -1 qu'avec une réponse, car je trouve ça gavant que quelqu'un fasse un -1 sans justifier...
    Cordialement.

  15. #15
    Expert éminent sénior
    Je voulais quand même dire qu'il n'y a pas 2 formats mais au moins 3. Celui étendu quand on a défini la fonction, celui semi-rétracté donné par la commande "type", et celui complètement rétracté quand on remonte dans l'historique. (1 seule ligne).

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ func3 ()
    > {
    >     if echo zozo;
    >     sleep 2 & then
    >         echo ok;
    >     else
    >         echo ko;
    >     fi
    > }
    $ func3 () {     if echo zozo;     sleep 2 & then         echo ok;     else         echo ko;     fi; }
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

###raw>template_hook.ano_emploi###