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 :

Modification chaîne sed


Sujet :

Shell et commandes POSIX

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Chef projet IT
    Inscrit en
    Mars 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chef projet IT

    Informations forums :
    Inscription : Mars 2018
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Modification chaîne sed
    Bonjour à tous,
    J’aimerais faire appel à vos talents pour résoudre une problématique que j’ai actuellement.

    Je travaille sur Une machine unix et le script dans lequel je souhaite insérer la commande de modifications est en ksh..

    Il y’a différents traitements dans ce script et j’aimerais y ajouter une fonctionnalité.

    J’ai un fichier composé de plusieurs lignes de longueur fixe 30 caractères

    Chaque ligne commence par une lettre suivi d’un chiffre et 2 espaces, ensuite une succession de chiffre et lettre. Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A1  91190abc76TEST878    67890U
    A2  75150cdc87JEUX767    765896
    Donc ce que je cherche à faire c’est :
    - si la 1er ligne débute par A1 et 2 espaces
    Alors si en position 15 j’ai la chaîne TEST
    Alors si en position 23 j’ai 3 espace vide
    Je remplace cette zone par AIX

    J’arrive à récupérer la 1er ligne avec une commande head, les différentes zones de tests avec des cut mais impossible de modifier la ligne avec un sed..
    Je pense même que tout doit pouvoir être fait avec un sed mais je n’arrive pas à faire la commande
    J’en suis à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i*«*.save.modif*» -r1(^A1  (.{14})TEST/
    Je sèche pour la suite et indique la position de la modif..

    Donc si quelques pouvait m’aider sur le sujet ça serait sympa ..

    Merci à vous

  2. #2
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Bonjour,

    Le sed en question ressemble à ça (pas testé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '1s/^\(A1 .\{11\}TEST.\{4\}\)   /\1AIX/' fichier
    s'il fonctionne, reste plus qu'à rajouter l'option -i pour la modification du fichier.
    Cordialement.

  3. #3
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour

    Attention, le forum a mangé un espace après A1, n'en laissant qu'un.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Chef projet IT
    Inscrit en
    Mars 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chef projet IT

    Informations forums :
    Inscription : Mars 2018
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Salut,
    je viens de tester la commande et j'ai une erreur..

    Je l'ai mise dans un remplace.sh :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #!/bin/ksh
    sed '1s/^\A1  .\{11\}TEST.\{4\}\)    /\1AIX/' fichier
    exit 0
    et j'ai le message d'erreur suivant au lancement du fichier
    ./remplace.sh

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed: Function 1s/^\A1  .\{11\}TEST.\{4\}\)    /\1AIX/ cannot be parsed.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Chef projet IT
    Inscrit en
    Mars 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chef projet IT

    Informations forums :
    Inscription : Mars 2018
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    ah non je viens de voir que je n'avais pas bien retranscrit la commande..
    Ca passe, c'est parfait je te remercie !

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Chef projet IT
    Inscrit en
    Mars 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chef projet IT

    Informations forums :
    Inscription : Mars 2018
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    dernier souci, je n'arrive pas à modifier le fichier courant
    en mettant le -i, j'ai l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sed: illegal option -- i
    Usage:  sed [-n] [-u] Script [File ...]
            sed [-n] [-u] [-e Script] ... [-f Script_file] ... [File ...]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i '1s/^\(A1 .\{11\}TEST.\{4\}\)   /\1AIX/' fichier

  7. #7
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Tu n'as pas trop le choix, il faut que tu passes par un fichier temporaire, le sed que tu utilises ne sait pas faire de remplacement "In place".

    Par curiosité, tu dis que ton script ksh fait plusieurs choses, est-ce sur le même fichier ?
    Si oui, ne peux-tu traiter toutes tes actions en ne lisant qu'une seule fois le fichier ?
    Cordialement.

  8. #8
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Tu n'as pas trop le choix, il faut que tu passes par un fichier temporaire, le sed que tu utilises ne sait pas faire de remplacement "In place".
    Pas étonnant, l'option -i étant une extension GNU non POSIX.

    D'ailleurs, l'option de GNU sed nommée "in-place" est trompeuse puisqu'elle ne travaille pas sur le fichier lui-même. GNU sed crée un fichier temporaire contenant la sortie de l'édition du fichier original par les commandes sed, puis, s'il n'y a pas eu d'erreur, renomme ce fichier temporaire avec le nom du fichier original, qui est donc perdu (sauf si on a ajouté un suffixe à l'option -i --inline=) pour créer un backup.
    ɹǝsn *sıɹɐlos*

  9. #9
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Quelque part, c'est plus sur, car en cas de plantage de la machine, on ne perd pas le fichier original... c'est d'ailleurs pour ça que je n'ai pas parlé de la solution qui passe par le fameux "ouverture d'un descripteur de fichier + suppression du dit fichier"

    Sinon, dans le man en français du gnu sed, on a en option longue:
    -i[SUFFIX], --in-place[=SUFFIX]

    Éditer le fichier en ligne (faire une sauvegarde si une extension est fournie).
    Cordialement.

  10. #10
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Ce que je veux dire, c'est que le nom de l'option de GNU sed est incorrect, il ne s'agit pas d'une édition en ligne.

    D'un autre côté, une vraie édition en ligne, en plus d'être risquée, serait très inefficace avec de gros fichiers.
    ɹǝsn *sıɹɐlos*

  11. #11
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 278
    Points : 12 726
    Points
    12 726
    Par défaut
    D'ailleurs, je me suis déjà fais avoir en utilisant le -i avec un script sed qui avait la commande 'q' (quitte).
    Cordialement.

Discussions similaires

  1. Supprimer sous-chaîne - Sed
    Par Svengali48 dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 27/10/2015, 20h16
  2. Modification chaîne de caractère
    Par linooo dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 29/06/2007, 23h24
  3. modification d'une chaîne passée en paramètre
    Par g0up1l dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 25/03/2007, 18h17
  4. Réponses: 4
    Dernier message: 04/03/2007, 13h26
  5. Modification de la propriété Chaîne vide autorisée
    Par hirochirak dans le forum Access
    Réponses: 3
    Dernier message: 11/01/2007, 10h28

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