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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 é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

  8. #8
    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 ... =)

  9. #9
    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

  10. #10
    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

+ 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