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 Avatar de K-store
    Homme Profil pro
    étudiant en informatique
    Inscrit en
    août 2017
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 19
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : étudiant en informatique

    Informations forums :
    Inscription : août 2017
    Messages : 16
    Points : 13
    Points
    13
    Par défaut 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 Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    septembre 2005
    Messages
    4 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : septembre 2005
    Messages : 4 093
    Points : 10 070
    Points
    10 070
    Par défaut
    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
    Avatar de N_BaH
    Profil pro
    Inscrit en
    février 2008
    Messages
    5 850
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2008
    Messages : 5 850
    Points : 15 339
    Points
    15 339
    Par défaut
    moi, je voudrais savoir pourquoi faire cette modification i nu tile.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre à l'essai Avatar de K-store
    Homme Profil pro
    étudiant en informatique
    Inscrit en
    août 2017
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 19
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : étudiant en informatique

    Informations forums :
    Inscription : août 2017
    Messages : 16
    Points : 13
    Points
    13
    Par défaut
    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
    Avatar de N_BaH
    Profil pro
    Inscrit en
    février 2008
    Messages
    5 850
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2008
    Messages : 5 850
    Points : 15 339
    Points
    15 339
    Par défaut
    c'est moche.

    par contre, tu pourrais indenter le code. Ça c'est joli, et utile pour améliorer la lisibilité.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre à l'essai Avatar de K-store
    Homme Profil pro
    étudiant en informatique
    Inscrit en
    août 2017
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 19
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : étudiant en informatique

    Informations forums :
    Inscription : août 2017
    Messages : 16
    Points : 13
    Points
    13
    Par défaut
    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 Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    septembre 2005
    Messages
    4 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : septembre 2005
    Messages : 4 093
    Points : 10 070
    Points
    10 070
    Par défaut
    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 Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    décembre 2012
    Messages
    3 358
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : décembre 2012
    Messages : 3 358
    Points : 9 690
    Points
    9 690
    Par défaut
    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
    Avatar de N_BaH
    Profil pro
    Inscrit en
    février 2008
    Messages
    5 850
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2008
    Messages : 5 850
    Points : 15 339
    Points
    15 339
    Par défaut
    ce n'est pas moins moche.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Expert éminent Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    décembre 2012
    Messages
    3 358
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : décembre 2012
    Messages : 3 358
    Points : 9 690
    Points
    9 690
    Par défaut
    ???
    Cordialement.

  11. #11
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    septembre 2005
    Messages
    4 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : septembre 2005
    Messages : 4 093
    Points : 10 070
    Points
    10 070
    Par défaut
    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 Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    décembre 2012
    Messages
    3 358
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : décembre 2012
    Messages : 3 358
    Points : 9 690
    Points
    9 690
    Par défaut
    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
    Avatar de N_BaH
    Profil pro
    Inscrit en
    février 2008
    Messages
    5 850
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2008
    Messages : 5 850
    Points : 15 339
    Points
    15 339
    Par défaut
    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.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  14. #14
    Expert éminent Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    décembre 2012
    Messages
    3 358
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : décembre 2012
    Messages : 3 358
    Points : 9 690
    Points
    9 690
    Par défaut
    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 Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    septembre 2005
    Messages
    4 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : septembre 2005
    Messages : 4 093
    Points : 10 070
    Points
    10 070
    Par défaut
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SNMP] Besoin d'aide pour SNMP, MIB dans script
    Par suya95 dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 17/05/2006, 17h20
  2. Réponses: 21
    Dernier message: 10/04/2006, 15h29
  3. Besoin d'aide pour trouver un projet
    Par ptitJP dans le forum C++
    Réponses: 22
    Dernier message: 27/02/2005, 00h14
  4. Besoin d'aide pour trouver un SGBD SVP
    Par rateub dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 26/01/2005, 21h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo