IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Scripts/Batch Discussion :

Suppression de lignes de plusieurs fichiers en Batch


Sujet :

Scripts/Batch

  1. #1
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 25
    Par défaut Suppression de lignes de plusieurs fichiers en Batch
    Salut à tous,

    Je souhaite pouvoir automatiser la suppression de lignes dans plusieurs fichiers texte.
    Les lignes que je veux supprimer sont en fait des commentaires.
    Je voudrai donc pouvoir supprimer tout ce qui se trouve entre "/*" et "*/" dans les fichiers.

    J'ai vu qu'il était possible d'utiliser la commande "sed" pour pouvoir supprimer des lignes d'un fichier, mais la syntaxe m'échappe totalement.
    Le code suivant permet la suppression des lignes, et copie le résultat dans un fichier temporaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed ''/*','*/'d' fichier_origine.txt > fichier_temp.txt
    En ce qui concerne l'automatisation sur tous les fichiers, je ne vois pas du tout comment la réaliser :/

    Pouvez-vous m'aider sur ce problème? car cela fait un moment que je suis dessus et je ne trouve aucune solution viable.
    Merci pour votre aide

  2. #2
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 25
    Par défaut
    Voilà où j'en suis maintenant ...
    Tout d'abord le code que j'ai mis dans le post précédent pose problème, en effet il supprime seulement les lignes comprenant "/*" et "*/" et même les lignes avec seulement "*".

    Enfin voilà tout de même mon code actuel ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dir /b testouille > liste.txt
    for /f %%j in (liste.txt) do (
    sed '/*','*/'d' testouille\%%j > testouille\%%j.old
    move testouille\%%j.old testouille\%%j)
    Comme vous pouvez le voir, j'ai résolu le problème pour réaliser la suppression sur tous les fichiers de mon répertoire (testouille)... seulement la syntaxe pour la suppression n'est pas la bonne

    Avez-vous une idée?
    Merci d'avance =)

  3. #3
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 25
    Par défaut
    Hum le sujet ne défoule pas les passions xD
    J'ai trouvé la syntaxe pour travailler sur un intervalle compris entre 2 expressions:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '/commentaire1/,/commentaire2/ p' fichier.txt
    Ce qui donnerait textuellement dans mon cas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '//*/,/*//d' testouille\%%j > testouille\test_%%j
    Mais comme mon expression comprend un / il faut apparemment mettre des \ autour de mon expression, ce qui donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '/\/*\/,/\*/\/d' testouille\%%j > testouille\test_%%j
    Apparemment quand je le lance comme ça, il ne reconnaît pas le \.
    De plus, pour un problème de visualisation, il est préférable de changer le / de base par un symbole choisi, ce qui me donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '\#/*#,#*/#d' testouille\%%j > testouille\test_%%j
    Encore une fois il me met une erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed: -e expression #1, char 7: unexpected ','
    J'ai encore du boulot pour trouver la bonne syntaxe
    Merci d'avance si vous avez la moindre idée =)

  4. #4
    Membre Expert Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Par défaut
    Bonjour,

    Cette syntaxe semble fonctionner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed s/\/\*.*\*\///g fichier_source > fichier_destination
    Cependant si tu as des commentaires sur plusieurs lignes de la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /* debut du commentaire
    blabla
    fin du commentaire */
    Cela ne les supprime pas. Il faut adapter. (par exemple remplacer les retour à la ligne par une chaine particulière, executer la suppression des commentaire puis remettre les retours à la ligne. Il y a peut être moyen de faire ignorer à sed les retours à la ligne aussi).


    Pour ce qui est de l'automatisation sur plusieurs fichiers, une boucle for sur un repertoire, une liste fixe, un fichier fera l'affaire. Tu as beaucoup d'exemple pour cela sur ce forum (dans la FAQ aussi).

  5. #5
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 25
    Par défaut
    Merci de ta réponse,

    Cependant, quand je lance ta commande, je reçois l'erreur suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed: -e expression #1, char 9: unknown option to 's'
    Je redonne le fichier .bat que j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/bash
    dir /b testouille > liste.txt
    pause...
    for /f %%j in (liste.txt) do (
    echo %%j
    sed s/\/\*.*\*\///g testouille\%%j > testouille\test_%%j
    move testouille\test_%%j testouille\%%j)
    pause...
    Je vais bûcher sur ton idée de retour à la ligne, ça me semble une bonne idée à creuser.

    Pour ce qui est de la boucle pour le faire sur tous les fichiers, je pense que celle de mon script là fait l'affaire, en tout cas elle marche pour les tests que j'ai réalisé

  6. #6
    Membre Expert Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Par défaut
    Bizarre chez moi ça fonctionne cette ligne.
    Si tu la testes hors de ton batch il te fait la même chose ?

    Tu n'as pas d'espaces dans tes noms de fichiers ?

    Pour la boucle effectivement j'avais pas vu que tu avais déjà répondu à la question

  7. #7
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 25
    Par défaut
    Yop,

    Bah écoute quand je lance la commande hors du batch ça me rend le même résultat ... et je n'ai aucun espace dans mes noms de fichier.

    Je me suis penché sur ton idée de tout à l'heure concernant les sauts de ligne.
    J'ai trouvé une commande qui met l'ensemble d'une ligne n+1 à la suite d'une ligne n.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i -n '2 h; 1 { G; N; s/\n//g};P' testouille\%%j
    Ici, par exemple, la ligne 2 du fichier sera mise à la suite de la ligne 1.

    Je me dis qur je peux peut-être faire un truc du genre:

    1. je stocke le numéro de la ligne où je rencontre "/*" dans une variable A
    2. je stocke le numéro de la ligne où je rencontre "*/" dans une variable B.
    3. "Tant que B <> A, je mets la ligne B à la suite de la ligne A"
    4. je supprime la ligne commençant par "/*"

    Le problème est que je n'arrive pas à déclarer une variable et l'utiliser ensuite dans le bash.
    Si je fais:
    Il me met l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'var' n'est pas reconnue en tant que commande interne ou externe, un programme exécutable ou un fichier de commandes.
    Je pars peut-être dans un truc super compliqué mais bon dis moi ce que t'en penses.

  8. #8
    Membre Expert Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Par défaut
    Pour les variables tu dois utiliser la commande set et appeler tes variables entre %%.

    Pour sed, j'avoue ne pas connaître suffisement cette fonction pour utiliser des paramètres avancés comme ceux-la.
    Mais ça m'interesse, j'essairai de chercher un peu demain.

  9. #9
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 25
    Par défaut
    C'est reparti, je m'y remets ce matin ...
    Merci pour les variables, ça va me permettre d'avancer un petit peu je pense =)

  10. #10
    Membre éprouvé
    Avatar de koKoTis
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 438
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 438
    Par défaut
    Citation Envoyé par Chris_Ewoks Voir le message
    Voilà où j'en suis maintenant ...
    Tout d'abord le code que j'ai mis dans le post précédent pose problème, en effet il supprime seulement les lignes comprenant "/*" et "*/" et même les lignes avec seulement "*".

    Enfin voilà tout de même mon code actuel ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dir /b testouille > liste.txt
    for /f %%j in (liste.txt) do (
    sed '/*','*/'d' testouille\%%j > testouille\%%j.old
    move testouille\%%j.old testouille\%%j)
    Comme vous pouvez le voir, j'ai résolu le problème pour réaliser la suppression sur tous les fichiers de mon répertoire (testouille)... seulement la syntaxe pour la suppression n'est pas la bonne

    Avez-vous une idée?
    Merci d'avance =)

    c'est move que tu utilise pour la suppresion ?
    il faut utiliser la commande del

  11. #11
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 25
    Par défaut
    Pour te répondre Kokotis, j'utilisais move pour transférer le fichier temporaire (testouille\%%j.old) dans le fichier d'origine (testouille\%%j), pas pour supprimer.
    Depuis, j'ai vu qu'avec sed -i je n'avais plus besoin de passer par un fichier temporaire.

    Cependant, j'ai modifié mon code depuis, et voilà ce que ça donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/bash
    dir /b testouille > liste.txt
    for /f %%j in (liste.txt) do (
    echo %%j
    sed -i '/\/\*/,/\*\//d' testouille\%%j
    )
    del liste.txt
    pause...
    J'ai laissé tomber, pour le moment, l'idée de trouver les numéros des lignes et de mettre tous les commentaires sur une seule ligne avant de supprimer.

    Je pense que je me rapproche du but, mais ma commande sed merdouille encore.
    Elle supprime bien les commentaires de la forme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /*blablablabla
    blablablablabla
    blablablablabla*/
    Mais quand elle tombe sur cette forme là, elle efface tout au lieu de supprimer seulement les commentaires:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /*blablablabla*/
    Mon code que je ne souhaite pas effacer
    /*blablablabla*/
    Si vous avez des idées sur la syntaxe à adopter ... =)

  12. #12
    Membre éprouvé
    Avatar de koKoTis
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 438
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 438
    Par défaut
    pour les numéro de ligne je ne sais pas trop ce que tu veut faire, mais dans le code ci-dessous:
    %%j = numéro de ligne
    %%k = ligne en cour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/bash
    dir /b testouille > liste.txt
    for /f "tokens=1,* delims=:" %%j in (findstr /n /r . liste.txt) do (
    echo %%j %%k
    sed -i '/\/\*/,/\*\//d' testouille\%%k
    )
    del liste.txt
    pause...
    mais enfin c'est peut être pas ce que tu veut, je sais pas

  13. #13
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 25
    Par défaut
    Hum j'ai du mal à piger ta syntaxe mais apparemment tu boucles sur le fichier "liste.txt" dans ce code.
    En fait, ce fichier me sert juste à effectuer ma commande sur tous les fichiers de mon répertoire.

    Après je pense qu'il y a moyen de trouver une syntaxe de sed qui supprime toutes les lignes comprises entre "/*' et '*/' que ce soit sur 1 ligne ou plusieurs. C'est surtout ça qui me pose problème

  14. #14
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 25
    Par défaut
    Je trouve aucun exemple sur le net, mais est-il possible de faire un sed en disant:
    "je veux supprimer les lignes contenant la valeur 1 ET la valeur 2" ??
    Si j'arrive à trouver ça je pense pouvoir tout résoudre

  15. #15
    Membre émérite
    Avatar de maxim_um
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    895
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 895
    Par défaut
    Salut;

    Citation Envoyé par Chris_Ewoks
    Après je pense qu'il y a moyen de trouver une syntaxe de sed qui supprime toutes les lignes comprises entre "/*' et '*/' que ce soit sur 1 ligne ou plusieurs. C'est surtout ça qui me pose problème
    ...
    Je trouve aucun exemple sur le net

    Et bien on va en faire un:


    source.cpp
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    //#f:source.cpp
    //#i:just for the fun
    /* 
    exemple d'usage de gnu sed 3.02.80
    pour la suppression des commentaires
    de types c et c++ forum developpez.net
    */
     
    #include <iostream> //inclusion de Input Output Stream (Stream Class content)
    using namespace std; //utilisation de l'espace de nom Standard
     
    /* Dans cette source il y a au final plus 
    de commentaires inutiles que de code utile.*/
     
    int main () /*compilez pour voire*/
    {
    cout <<"\a"<<"\a"<<"\a"<<endl; 
    //std::cout contraction de Standard Console Output (Stream Object)
    return 0; 
    } 
    //:f#source.cpp

    ncoment.cmd
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    @echo off
    ::forum developpez.net
    cls
    sed "s/\/\/.*//;s/\/\*.*\\*\///;/\/\*/,/\*\//d;/^ *$/d" source.cpp
    echo.
    pause

    Enjoy

  16. #16
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 25
    Par défaut
    Et bien écoute MERCI, rien à dire de plus ... J'ai bien galéré sur ce fameux sed mais au moins ça m'a permis de découvrir pas mal de subtilités :p

    Je vous poste mon code final, pour ceux qui auront ce problème plus tard.

    Rappel:
    - Suppression dans un fichier de tout ce qui est en commentaire (compris entre /* et */)
    - Action réalisée sur tous les fichiers d'un répertoire (ici répertoire testouille)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/bash
    #On fait une liste de tous les fichiers du répertoire "testouille" dans le fichier "liste.txt"
    dir /b testouille > liste.txt
    #Pour chaque ligne du fichier "liste.txt"...
    for /f %%j in (liste.txt) do (
    #on supprime les lignes comprises entre /* et */
    sed -i "s/\/\/.*//;s/\/\*.*\\*\///;/\/\*/,/\*\//d;/^ *$/d" testouille\%%j
    )
    #on supprime le fichier "liste.txt"
    del liste.txt
    Voilà, merci à tous et bonne continuation =)

  17. #17
    Membre Expert Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Par défaut
    La magie des expressions régulières ... ou comment dégouter quelqu'un de l'informatique.

    Mais si c'est simple regarde s/\/\/.*//;s/\/\*.*\\*\///;/\/\*/,/\*\//d;/^ *$/d, je ne vois pas ce qui te bloque franchement tu n'y met pas du tiens !


    N'ayant finalement pas eu le temps de me pencher plus sur le sujet, merci à maxim_um pour cette solution.

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

Discussions similaires

  1. Suppression de 2 premieres lignes de plusieurs fichier
    Par Fatehcz dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 29/01/2014, 20h12
  2. Suppression de ligne dans plusieurs table
    Par chris60 dans le forum Oracle
    Réponses: 6
    Dernier message: 27/04/2006, 17h46
  3. Suppression de lignes dans un fichier texte
    Par Isa31 dans le forum Langage
    Réponses: 16
    Dernier message: 26/01/2006, 20h07
  4. Suppression de lignes dans un fichier sous dos
    Par ducho dans le forum Windows
    Réponses: 2
    Dernier message: 16/05/2005, 10h20
  5. Suppression de lignes dans un fichier
    Par bubu dans le forum Linux
    Réponses: 2
    Dernier message: 13/01/2005, 10h36

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