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

Shell et commandes GNU Discussion :

Sortie d'un fichier sans lignes vides ni commentaires


Sujet :

Shell et commandes GNU

  1. #1
    Invité
    Invité(e)
    Par défaut Sortie d'un fichier sans lignes vides ni commentaires
    bonjour tout le monde
    la question que je cherche à résoudre est de faire sortir un fichier de configuration en éliminant les commentaire et les lignes vides
    j'ai donc fait la chose suivante en deux temps
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -v "^#" /usr/local/etc/clamd.conf > /home/paul/clamdconf.txt
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -v "^$" /home/paul/clamdconf.txt > /home/paul/clamdconf.txt
    j'ai tenté la méthode suivante qui ne donne pas de bon résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -v "^(#|$)" /usr/local/etc/clamd.conf > /home/paul/clamdconf.txt
    Comment construire une instruction avec une expression régulière reconnue par grep pour sortir donc depuis le premier fichier un fichier où toutes les lignes commentées et vides sont éliminées ?

    Merci d'avance de toute aide.
    paul
    Dernière modification par ggnore ; 28/11/2008 à 09h07.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par paulriluma Voir le message
    bonjour tout le monde
    la question que je cherche à résoudre est de faire sortir un fichier de configuration en éliminant les commentaire et les lignes vides
    j'ai donc fait la chose suivante en deux temps
    grep -v "^#" /usr/local/etc/clamd.conf > /home/paul/clamdconf.txt
    puis
    grep -v "^$" /home/paul/clamdconf.txt > /home/paul/clamdconf.txt

    j'ai tenté la méthode suivante qui ne donne pas de bon résultat :
    grep -v "^(#|$)" /usr/local/etc/clamd.conf > /home/paul/clamdconf.txt

    Comment construire une instruction avec une expression régulière reconnue par grep pour sortir donc depuis le premier fichier un fichier où toutes les lignes commentées et vides sont éliminées ?

    Merci d'avance de toute aide.
    paul
    essayez
    notez qu'une ligne avec uniquement des "blancs" (tab ou space) ne sera pas considérée comme vide…

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    grep "^[^#|^$|^ *$]"

  3. #3
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Pour retirer des lignes d'un fichier, la commande sed est la meilleure, à mon avis. Je ne suis pas très calé, mais après quelques essais j'ai de bons résultats avec la commande suivante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -ei '/^[ \t]*\(#\|$\)/d' fichier.txt
    Explications:

    • Le fichier sera directement modifié avec l'option -i.
    • Je cherche les lignes commençant par 0 ou plusieurs espaces ou tabs, suivis de # ou de rien du tout. Si c'est bon, je supprime la ligne. Donc en clair, je supprime:
      • les lignes vides,
      • les lignes contenant juste des espaces ou des tab,
      • les lignes commençant par 0 ou plusieurs espaces ou tab, suivis de #.

    Un problème bien posé est déjà résolu (H. Bergson).

  4. #4
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Points : 4 130
    Points
    4 130
    Par défaut
    Salut,

    Et comme ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed "/[^#.*|^$|^( |\t)*$]/d" <ton_fichier_entrée> > <ton_fichier_sortie>
    PS : à vérifier la 3ème partie de l'expression je suis pas sûr.
    Winnt
    Merci de lire les règles du forum LaTeX et Qu'est ce qu'un ECM ?.
    N'hésitez pas à parcourir la FAQ la réponse y est peut-être déjà.
    Pensez au bouton si votre problème est résolu.


    C'est en Linuxant qu'on devient .... geek
    Et c'est en LateXant qu'on devient flemmard
    Mon blog tout neuf.
    Articles : présentation de la distribution Gentoo, Les index sous LaTeX et leur personnalisation.

  5. #5
    Membre confirmé
    Avatar de MaliciaR
    Inscrit en
    Juillet 2008
    Messages
    513
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juillet 2008
    Messages : 513
    Points : 600
    Points
    600
    Par défaut
    Salut,

    Une question bête : qu'est-ce que le \t dans ces expressions : [ \t] et ( |\t) ?
    Le tact dans l'audace c'est de savoir jusqu'où on peut aller trop loin. Cocteau
    L'abjection la plus totale, ce n'est pas de trahir, c'est de ne jamais donner un commencement de réalité à ses rêves les plus fous. M. Moreau


    Les indispensables : Les règles, , FAQ et tutos avant de poster, et !
    Traduction de Linux Device Drivers 3 : venez participer
    membre de l'April - Promouvoir et défendre les logiciels libres

  6. #6
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Points : 4 130
    Points
    4 130
    Par défaut
    Salut,

    Le \t correspond au caractère tabulation.
    Winnt
    Merci de lire les règles du forum LaTeX et Qu'est ce qu'un ECM ?.
    N'hésitez pas à parcourir la FAQ la réponse y est peut-être déjà.
    Pensez au bouton si votre problème est résolu.


    C'est en Linuxant qu'on devient .... geek
    Et c'est en LateXant qu'on devient flemmard
    Mon blog tout neuf.
    Articles : présentation de la distribution Gentoo, Les index sous LaTeX et leur personnalisation.

  7. #7
    Membre confirmé
    Avatar de MaliciaR
    Inscrit en
    Juillet 2008
    Messages
    513
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juillet 2008
    Messages : 513
    Points : 600
    Points
    600
    Par défaut
    Ah oki Merci!

    Parfois, je ferais mieux de mettre mon cerveau en mode ON
    Le tact dans l'audace c'est de savoir jusqu'où on peut aller trop loin. Cocteau
    L'abjection la plus totale, ce n'est pas de trahir, c'est de ne jamais donner un commencement de réalité à ses rêves les plus fous. M. Moreau


    Les indispensables : Les règles, , FAQ et tutos avant de poster, et !
    Traduction de Linux Device Drivers 3 : venez participer
    membre de l'April - Promouvoir et défendre les logiciels libres

  8. #8
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    @ winnt:
    J'ai testé ce que tu proposes et il y a plusieurs lignes supprimées qui ne devraient pas, tandis que d'autres composées d'espaces et de tab restent.

    Je suis loin d'être spécialiste de sed, mais je crois que ce qu'il y a entre crochets devrait être une liste de caractères, pas les * pour dire que le caractère précédent se répète.
    Un problème bien posé est déjà résolu (H. Bergson).

  9. #9
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par jmelyn Voir le message
    @ winnt:
    J'ai testé ce que tu proposes et il y a plusieurs lignes supprimées qui ne devraient pas, tandis que d'autres composées d'espaces et de tab restent.

    Je suis loin d'être spécialiste de sed, mais je crois que ce qu'il y a entre crochets devrait être une liste de caractères, pas les * pour dire que le caractère précédent se répète.
    il y a une raison particulière à ne pas vouloir faire de pipe ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sed "/^[ \t]*$/d" INPUT | sed "/^[ \t]*#/d" > OUTPUT
    ou sans pipe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sed '/^[ \t]*$/d;/^[ \t]*#/d' INPUT > OUTPUT

  10. #10
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Deux possiblités avec grep :

    1) Avec les regexp de base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -v -e '^[[:blank:]]*#' -e '^[[:blank:]]*$'
    2) Avec les regexp étendues :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -Ev -e '^[[:blank:]]*(#|$)'

  11. #11
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Comme le suggère Matafan, on peut utiliser les classes de caractères ([[:alpha:]], [[:blank:]], [[:cntrl:]]...) et dans ce cas, il y a forte similitude entre les commandes grep et sed.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    grep -Ev -e '^[[:blank:]]*(#|$)'
        sed -e '/^[[:blank:]]*\(#\|$\)/d'
    Sauf que pour sed, il faut échapper les caractères (, ), | comme ceci: \(, \), \|. Finalement, je préfère le code de Matafan qui est plus lisible (le code, pas Matafan).
    Un problème bien posé est déjà résolu (H. Bergson).

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2
    Points : 6
    Points
    6
    Par défaut
    Bonjour,
    la réponse est simple: le code que ta écris est presque correcte, pour avaoir le résultat souhaitée, tu va mettre egrep au lieu de grep:

    egrep -v "^(#|$)" /usr/local/etc/clamd.conf > /home/paul/clamdconf.txt

Discussions similaires

  1. [XL-2007] Recopier une liste sans lignes vides
    Par filsdepub dans le forum Excel
    Réponses: 3
    Dernier message: 09/12/2014, 11h11
  2. formule pour recopier une liste sans ligne vide
    Par ANGLIQUESOIG dans le forum Excel
    Réponses: 2
    Dernier message: 14/03/2013, 11h13
  3. Parser un fichier par ligne vide
    Par wbulot dans le forum Langage
    Réponses: 2
    Dernier message: 12/12/2011, 11h31
  4. Ouvrir un fichier dans lignes vides
    Par Maxime082 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/05/2011, 18h59
  5. KSH: Supprimer des lignes vides (sans espaces ni tab) en fin de fichier text
    Par SmileAndFly dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 31/07/2008, 20h47

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