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 POSIX Discussion :

Remplacer une chaine de char par du blanc


Sujet :

Shell et commandes POSIX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Titouf
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 177
    Par défaut Remplacer une chaine de char par du blanc
    Bonjour,

    J'aimerais remplacer dans un fichier toto.dat les caractères de 4 à 6 par du blanc si le second octet est un 2.

    comment dois je faire?

    exemple fichier à traiter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    21A646Z2211231
    12B646X5556432
    22D555W5645556
    Exemple fichier attendu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    21A646Z2211231
    12B   X5556432
    22D   W5645556
    Il y a bien trois espaces qui ont remplacé des patterns différents.

    Merci pour votre aide.

    Bonne journée.

  2. #2
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    fps@fra:~$ cat > toto
    21A646Z2211231
    12B646X5556432
    22D555W5645556
    fps@fra:~$ sed "/^.2/ s/\(...\).../\1   /" toto
    21A646Z2211231
    12B   X5556432
    22D   W5645556
    fps@fra:~$

    /^.2 = toute ligne dont le second caractère est 2
    substitue \(3 caracteres\) suivi de 3 autres par \1 "les 3 premiers" suivit de 3 espaces

  3. #3
    Membre confirmé Avatar de Titouf
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 177
    Par défaut
    Merci pour ta réponse.

    Comment sait il que c'est de la position 4 à 6 parce que mon fichier est un peu plus long et je dois préciser les positions.

    Idem pour la valeur à tester qui est en réalité en 8ième position.

    Merci encore pour ton aide.

  4. #4
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    Citation Envoyé par Titouf Voir le message
    Merci pour ta réponse.

    Comment sait il que c'est de la position 4 à 6 parce que mon fichier est un peu plus long et je dois préciser les positions.

    Idem pour la valeur à tester qui est en réalité en 8ième position.

    Merci encore pour ton aide.

    si je prend la 8ième
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    fpsl@fra:~$ cat > toto
    21A646Z2211231
    12B646X5556432
    22D555W5645556
    fps@fra:~$ sed "/^.......2/ s/\(...\).../\1   /" toto
    21A   Z2211231
    12B646X5556432
    22D555W5645556
    fps@fra
    c'est le nombre de caractères

    "." = 1 caractère
    ".*" = N'importe quel caractère en n'importe quelle nombre
    ".a[1-9]" n'importe quel caractère suivi de "a" suivi d'un chiffre
    etc...

    voir les regexp de sed (expressions régulières)

    là dans le contexte ça donne
    /^.......2/ s/\(...\).../\1 /
    qui se traduit en 1 condition + une action :
    /^.......2/ sur toute ligne qui commence par 7caractères suivi d'un "2"
    s/\(...\).../\1 / substitute "3 caractères" suivi de 3 autres par "les même 3 caractères+3espace"

    ou si tu comprends mieux avec la syntaxe optimisée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     sed "/^.\{7\}2/ s/\(.\{3\}\).\{3\}/\1   /" toto
    21A   Z2211231
    12B646X5556432
    22D555W5645556
    /^.\{7\}2/ sur toute ligne qui commence par 7 caractères suivi d'un "2"
    s/\(.\{3\}\).\{3\}/\1 /" substitute "copier(3caractères)"suivi de 3 caractères par '\coller n°1' suivi de 3 espaces

    ça permet de ne pas compter unitairement les "."

    http://sed.sourceforge.net/sed1line.txt <= peut t'aider à faire des tests et à comprendre ou aussi ça : http://www.funix.org/fr/unix/expr-sed.htm ou encore : http://www.tutorialspoint.com/unix/u...xpressions.htm

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/02/2009, 23h18
  2. Réponses: 10
    Dernier message: 24/11/2008, 13h14
  3. Remplacer une chaine de car par une autre ds 1 ligne
    Par jayan dans le forum VBScript
    Réponses: 1
    Dernier message: 07/05/2008, 10h24
  4. JSP : comment remplacer une chaine de caractères par une autre
    Par techquos dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 14/12/2006, 09h37
  5. Réponses: 4
    Dernier message: 16/04/2004, 16h31

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