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 :

sed - différence de comportement linux/AIX


Sujet :

Shell et commandes POSIX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut sed - différence de comportement linux/AIX
    Bonjour,
    je ne connais pas très bien sed (bien que mon premier éditeur de texte (après les puncheuses) ait été l'antique "ed"!).

    Pour gérer des expressions régulières sur plusieurs lignes, j'ai trouvé sur internet et utilisé la commande sed -e ':a' -e 'N' -e '$!ba' qui, d'après ce que j'ai compris, met dans la zone de travail de sed l'intégralité du fichier, y compris les fins de ligne (qui sont des linefeed). Il me suffit alors d'ajouter mes commandes de substitution comme -e 's/xxx\nyyy/zzz/g' et le tour est joué.

    Sous linux, ça marche parfaitement! Sous AIX 6.1, j'ai constaté que "sed" ne comprend pas les ";". J'ai donc dû les supprimer et découper en autant de "-e" consécutifs. Sinon, le programme se comporte de la même manière et fournit le même résultat dans beaucoup de cas, sauf lorsque le fichier d'entrée ne comporte qu'une seule ligne.

    Pour faire simple, j'ai réduit les instructions au minimum.

    Sous linux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ echo -e 'ligne 1\nligne 2' | sed -e ':a' -e 'N' -e '$!ba' 
    ligne 1
    ligne 2
    $ echo 'ligne 1' | sed -e ':a' -e 'N' -e '$!ba' 
    ligne 1
    Sous AIX:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ echo 'ligne 1\nligne 2' | sed -e ':a' -e 'N' -e '$!ba'
    ligne 1
    ligne 2
    $ echo 'ligne 1' | sed -e ':a' -e 'N' -e '$!ba'
    J'en appelle à nos chers spécialistes (zipe31 mvvvv et autres ) pour tenter de m'expliquer pourquoi la dernière commande ne produit rien, si c'est normal ou si c'est un bug linux ou AIX et m'indiquer, le cas échéant, s'il y a un moyen d'obtenir le même comportement que sous linux?

    Merci d'avance

    )jack(

  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,

    Désolé mais je ne connais que très peu les versions sed des Unixes, pour ne pas dire pas du tout, n'ayant jamais eu de quoi les tester


    Par contre pourrais-tu essayer en enlevant le 1er "-e", celui du label. Le label n'étant pas une commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo 'ligne 1' | sed ':a' -e 'N' -e '$!ba'
    Sans conviction tout de même

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 665
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 665
    Par défaut
    il ne s'agit pas de bugs, c'est parce que la version sed de linux est GNU, et pas celle de AIX.

    il existe un forum AIX.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Salut,

    Désolé mais je ne connais que très peu les versions sed des Unixes, pour ne pas dire pas du tout, n'ayant jamais eu de quoi les tester


    Par contre pourrais-tu essayer en enlevant le 1er "-e", celui du label. Le label n'étant pas une commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo 'ligne 1' | sed ':a' -e 'N' -e '$!ba'
    Sans conviction tout de même
    Merci d'avoir répondu...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ echo 'ligne 1' | sed ':a' -e 'N' -e '$!ba'
    sed: Cannot find or open file -e.
    sed: Cannot find or open file N.
    sed: Cannot find or open file -e.
    sed: Cannot find or open file $!ba.
    ... mais ça ne lui plaît pas...

    En fait, comme mon code doit être portable sur différentes architectures, j'essaie de trouver le plus petit dénominateur commun!

    Je répète que le code passe bien la plupart des tests automatiques sous AIX. Ce n'est que lorsque le fichier ne comprend qu'une seule ligne que le sed d'AIX semble oublier le contenu du fichier et je me/vous demandais s'il y avait moyen de contourner cela avec une instruction sed supplémentaire:

    Par exemple, (mais je no sprecht "sed" very bueno ):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -e 'if current_line_is_not_the_last_one then -e ':a' -e 'N' -e '$!ba' else rien'
    Quelqu'un pourrait-il utiliser ses compétences linguistiques en "sed" pour traduire l'algorithme (somme toute assez simple) suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    si la première ligne est la dernière du fichier 
    alors ne rien faire de particulier # sed exécutera alors les "-e 's/xxx/yyy/'" suivants (dont certains ne matcheront pas (faute de présence de \n)).
    sinon tout mettre sur une ligne en faisant, par exemple, "-e ':a' -e 'N' -e '$!ba'"
    Si personne ne voit d'astuce, il est probable que je contournerai le problème soit en ajoutant une ligne vide que je supprimerai après coup par exemple, soit avec en testant le nombre de lignes du fichier dans le script appelant.

  5. #5
    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
    Citation Envoyé par jack-ft Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -e 'if current_line_is_not_the_last_one then -e ':a' -e 'N' -e '$!ba' else rien'
    Quelqu'un pourrait-il utiliser ses compétences linguistiques en "sed" pour traduire l'algorithme (somme toute assez simple) suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    si la première ligne est la dernière du fichier 
    alors ne rien faire de particulier # sed exécutera alors les "-e 's/xxx/yyy/'" suivants (dont certains ne matcheront pas (faute de présence de \n)).
    sinon tout mettre sur une ligne en faisant, par exemple, "-e ':a' -e 'N' -e '$!ba'"
    Si personne ne voit d'astuce, il est probable que je contournerai le problème soit en ajoutant une ligne vide que je supprimerai après coup par exemple, soit avec en testant le nombre de lignes du fichier dans le script appelant.
    Essaye ça :
    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
    $ cat script.sed 
    1{
    $ bz
    }
    :a
    N
    $! ba
    :z
    s/\n/--/g
    s/$/& FIN/
     
    $ echo -e 'ligne 1\nligne2' | minised -f script.sed 
    ligne 1--ligne2 FIN
     
    $ echo -e 'ligne 1' | minised -f script.sed 
    ligne 1 FIN
     
    $
    En fait "minised" est une version un peu moins évoluée que celle de GNUsed.
    J'ai mis le tout dans un scrip sed, en général ça passe mieux au niveau des sed d'AIX ou autres Unixes

    Si ça passe on essaiera de l'adapter sur une ligne

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Essaye ça :
    ...
    J'ai mis le tout dans un scrip sed, en général ça passe mieux au niveau des sed d'AIX ou autres Unixes

    Si ça passe on essaiera de l'adapter sur une ligne
    Génial! J'ai juste dû supprimer l'espace entre "$!" et "ba" (comme j'avais déjà dû le faire):

    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
    28
    29
    30
    bash-4.0$ cat > script.sed
    1{
    $ bz
    }
    :a
    N
    $! ba
    :z
    s/\n/--/g
    s/$/& FIN/
     
    bash-4.0$ echo -e 'ligne 1\nligne2' | sed -f script.sed
    sed: 0602-403 $! ba is not a recognized function.
     
    bash-4.0$ cat script.sed
    1{
    $ bz
    }
    :a
    N
    $!ba
    :z
    s/\n/--/g
    s/$/& FIN/
     
    bash-4.0$ echo -e 'ligne 1\nligne2' | sed -f script.sed
    ligne 1--ligne2 FIN
     
    bash-4.0$ echo -e 'ligne 1' | sed -f script.sed
    ligne 1 FIN
    Un grand merci pour cette première étape!

  7. #7
    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 jack-ft Voir le message
    Bonjour,
    je ne connais pas très bien sed (bien que mon premier éditeur de texte (après les puncheuses) ait été l'antique "ed"!).
    [...]
    Merci d'avance

    )jack(

    méfies toi, avec AIX il serait étonnant que le sed ai été GNUifié...

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par frp31 Voir le message
    méfies toi, avec AIX il serait étonnant que le sed ai été GNUifié...
    Réponse à N_bah et frp31: non, non, sur notre machine AIX, RIEN n'a été GNUifié.
    Par exemple, aucune commande ne prend d'argument long (genre --version). Au fur et à mesure de nos besoins et de la réécriture de code ancien, je collecte les différences et essaie au coup par coup de trouver des solutions portables... mais c'est du boulot!

    Jusqu'ici, j'ai à peu près réussi sans trop tester l'OS...

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 14/04/2010, 01h06
  2. Différence de comportement Win/Linux
    Par Slookeur dans le forum GTK+ avec C & C++
    Réponses: 7
    Dernier message: 22/07/2009, 10h44
  3. Réponses: 2
    Dernier message: 21/08/2006, 11h56
  4. [swing]Différence de comportement selon hardware
    Par xxaragornxx dans le forum Composants
    Réponses: 13
    Dernier message: 16/11/2005, 17h51
  5. [JFrame] Explication sur une différence de comportement
    Par jems dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 06/07/2005, 09h23

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