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

Linux Discussion :

Expression réguliere sed suppression début de fichier


Sujet :

Linux

  1. #1
    Membre très actif

    Inscrit en
    Août 2005
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 401
    Par défaut Expression réguliere sed suppression début de fichier
    Bonjour,

    J'ai un fichier de log comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ^@^@^@^@^@^@^M^F^L^@^@^@^@2012-03
    2012-03
    2012-03
    2012-03
    Mon objectif est de supprimer toues les caractères de début de fichier jusqu'à 2012-03 le premier qui apparaît.

    Est-ce possible avec sed ? Je ne suis pas très fort en expression régulière.

    J'ai essayé tout de même ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e "/^2012-03/d" myfile > testfile
    Mais malheureusement cela fait l'inverse de ce que je veux Cela supprime tout sauf les premiers caractère de la premier ligne.

    D'avance merci de votre aide

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/^[^[:digit:]]*//'
    Sous réserve que toutes tes lignes de logs commencent bien par un chiffre (date)

  3. #3
    Membre très actif

    Inscrit en
    Août 2005
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 401
    Par défaut
    Ah oui cela marcherait presque !

    J'ai oublié de préciser que la première ligne est de cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ^@^@^@^@^@^@^M^F^L^@^@^@^@12424:=;^@^@^@^@^@^@2012-03
    Donc ta solution me supprime bien les caractères avant mais pas après... Pour le moment. Il faudrait supprimer tous les caractères avant 2012 sur la première ligne en réalité.

    Désolé de te mettre à contribution mais j'ai encore du boulot pour comprendre les regex.

    Sinon oui toutes les lignes sont censé commencer par des chiffres. Tu peux encore me donner un petit coup de pouce pour les caractères étranges après la première date ?

    D'avance merci.

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Est-il possible d'avoir un exemple concret de ton fichier ?
    Parce qu'autant avoir tout d'un coup que de faire par bribes

  5. #5
    Membre très actif

    Inscrit en
    Août 2005
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 401
    Par défaut
    Ouep désolé je te met que les 5 premiers lignes car après c'est identique:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ^@^@^@^@^@^@^M^F^L^@^@^@^@12424:=;^@^@^@^@^@^@2012-03 12:00 c45.hp45
    2012-03 12:00 c45.hp45
    2012-03 12:00 c45.hp45
    2012-03 12:00 c45.hp45
    2012-03 12:00 c45.hp45
    2012-03 12:00 c45.hp45
    Il faudrait supprimer ces caractères étranges et aussi le 12424:=; qui traîne. Pour faire un traitement sur les données du fichier j'ai besoin d'avoir un fichier de log propre. Je ne sais pas à quoi sont dû les caractères comme ceci : ^@^@^M^F^L

    Ma foi. la solution que je vois c'est de supprimer que le début du fichier jusqu'à 2012-03.

    Je te remercie pour ton aide.

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Essaye ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/^.*;[^[:digit:]]*//'

  7. #7
    Membre très actif

    Inscrit en
    Août 2005
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 401
    Par défaut
    Aie cela fonctionne moins bien qu'avant. Il n'y a plus rien de supprimer maintenant. C'est le meme fichier en entrée et en sortie. J'ai vérifier plusieurs fois je fais ceci :

    sed "s/^.*;[^[:digit:]]*//" myfile > test

    Dans test c'est la meme chose que myfile.

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Code : 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
    $ cat plop
    ^@^@^@^@^@^@^M^F^L^@^@^@^@12424:=;^@^@^@^@^@^@2012-03 12:00 c45.hp45
    2012-03 12:00 c45.hp45
    2012-03 12:00 c45.hp45
    2012-03 12:00 c45.hp45
    2012-03 12:00 c45.hp45
    2012-03 12:00 c45.hp45
     
    $ sed 's/^.*;[^[:digit:]]*//' plop 
    2012-03 12:00 c45.hp45
    2012-03 12:00 c45.hp45
    2012-03 12:00 c45.hp45
    2012-03 12:00 c45.hp45
    2012-03 12:00 c45.hp45
    2012-03 12:00 c45.hp45
     
    $
    Maintenant reste à savoir si tes caractères zarbis sont des caractères littéraux (comme dans mon exemple ci-dessus) ou des caractères d'échappements et/ou non-imprimables comme ci dessous :

    Code : 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
    23
    24
    25
    26
    27
    $ cat fich
    
     12424:=;2012-03 12:00 c45.hp45
    2012-03 12:00 c45.hp45
    2012-03 12:00 c45.hp45
    2012-03 12:00 c45.hp45
    2012-03 12:00 c45.hp45
    2012-03 12:00 c45.hp45
     
    $ cat -A fich 
    ^@^@^@^@^@^@^M^F^L^@^@^@^@12424:=;^@^@^@^@^@^@2012-03 12:00 c45.hp45$
    2012-03 12:00 c45.hp45$
    2012-03 12:00 c45.hp45$
    2012-03 12:00 c45.hp45$
    2012-03 12:00 c45.hp45$
    2012-03 12:00 c45.hp45$
     
    $ sed -n l fich 
    \000\000\000\000\000\000\r\006\f\000\000\000\00012424:=;\000\000\000\
    \000\000\0002012-03 12:00 c45.hp45$
    2012-03 12:00 c45.hp45$
    2012-03 12:00 c45.hp45$
    2012-03 12:00 c45.hp45$
    2012-03 12:00 c45.hp45$
    2012-03 12:00 c45.hp45$
     
    $
    Auquel cas, la ligne suivante devrait faire l'affaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ sed 's/\x00\|\x0D\|\x06\|\x0C//g;s/.*;//' fich 
    2012-03 12:00 c45.hp45
    2012-03 12:00 c45.hp45
    2012-03 12:00 c45.hp45
    2012-03 12:00 c45.hp45
    2012-03 12:00 c45.hp45
    2012-03 12:00 c45.hp45
     
    $

  9. #9
    Membre très actif

    Inscrit en
    Août 2005
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 401
    Par défaut
    Ce sont des caractères non imprimables je crois. j'ai regardé avec hexdump...

    Cette commande fonctionne sed 's/\x00\|\x0D\|\x06\|\x0C//g;s/.*;//' mais il reste un = au tout début.

    Qu'est ce que je dois ajouter pour le supprimer ? En tout cas tu gère en Regex. Tu as tout mon respect.

    EDIT : j'ai tenté sed 's/\x00\|\x0D\|\x06\|\x0C|\=//g;s/.*;// mais sans succès...

    EDIT 2 : Voilà la solution : sed 's/\x00\|\x0D\|\x06\|\x0C\|\=//g;s/.*;//'

    merci pour ton aide.

  10. #10
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Si ta ligne ressemble bien à ^@^@^@^@^@^@^M^F^L^@^@^@^@12424:=;^@^@^@^@^@^@2012-03 12:00 c45.hp45 il aurait dû être supprimé

    Tu peux toujours rajouter un s/^=// à la commande "sed"...

  11. #11
    Membre très actif

    Inscrit en
    Août 2005
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 401
    Par défaut
    Ma ligne est bien celle que tu as... C'est en effet étrange qu'il reste là au milieu. J'ai rajouté le = dans sed est cela fonctionne.

    On va pas en demander plus que cela pour aujourd'hui. Encore merci pour ton aide et ton expertise des regex.

  12. #12
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Juste pour rajouter qu'en fin de compte le s/\x00\|\x0D\|\x06\|\x0C//g peut être remplacer par s/[[:cntrl:]]*//g et pour ton rajout du signe "égale", par s/[[:cntrl:]=]*//g

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

Discussions similaires

  1. Expression réguliere et nom de fichier
    Par delilou dans le forum Général Java
    Réponses: 4
    Dernier message: 24/03/2011, 09h39
  2. sed et écrire au début de fichier
    Par tarekphp dans le forum Unix
    Réponses: 2
    Dernier message: 05/01/2009, 15h36
  3. Réponses: 8
    Dernier message: 14/11/2003, 22h51
  4. Réponses: 2
    Dernier message: 11/08/2003, 13h43
  5. [LG]suppression dans un fichier
    Par cedrick essale dans le forum Langage
    Réponses: 5
    Dernier message: 10/08/2003, 15h22

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