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 sous OpenBSD 6


Sujet :

Shell et commandes POSIX

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut sed sous OpenBSD 6
    Bonjour,
    J'ai un fichier lefile
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    FILE "01.fichier 1" WAVE
      TRACK 01 AUDIO
        ARTIST "l'artiste"
        TITLE "titre1"
        INDEX 01 00:00:00
    FILE "02.fichier 2" WAVE
      TRACK 02 AUDIO
        ARTIST "l'artiste"
        TITLE "titre2"
        INDEX 01 00:00:00
    avec sed (GNU sed) 4.3 sur debian
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '/FILE/!{d;b};N;s/TRACK/truc/' cue.cue
    j'obtiens bien ce que j'attend.
    par contre sur OpenBSD, j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed: 1: "FILE/!{d;b};N;s/TRACK/ ...: unexpected EOF (pending }'s)
    J'ai essayé tout un tas de truc mais pas moyen.
    Si quelqu'un peut m’éclairer ?
    Merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par ctac_ Voir le message
    avec sed (GNU sed) 4.3 sur debian
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '/FILE/!{d;b};N;s/TRACK/truc/' cue.cue
    j'obtiens bien ce que j'attends.
    Sous macos, j'obtiens comme toi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ sed '/FILE/!{d;b};N;s/TRACK/truc/' 
    sed: 1: "/FILE/!{d;b};N;s/TRACK/ ...": unexpected EOF (pending }'s)
    Par contre, avec "gsed" (installé par sudo port install gsed), j'obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ gsed '/FILE/!{d;b};N;s/TRACK/truc/' cue.cue
    FILE "01.fichier 1" WAVE
      truc 01 AUDIO
    FILE "02.fichier 2" WAVE
      truc 02 AUDIO
    et j'obtiens le même résultat avec le sed "normal":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ grep -e '^\(FILE\| *TRACK\)' cue.cue | sed -e 's/TRACK/truc/'
    FILE "01.fichier 1" WAVE
      truc 01 AUDIO
    FILE "02.fichier 2" WAVE
      truc 02 AUDIO
    En l'absence de spécifications précises, et compte tenu que les 2 commandes produisent le même résultat sur l'ensemble du jeu de tests, on peut considérer qu'elles sont équivalentes (au moins sur le jeu de tests fourni!).

  3. #3
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 285
    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 285
    Points : 12 740
    Points
    12 740
    Par défaut
    Bonjour,

    L'erreur est le non respect de la "vraie" syntaxe sed (manque un ";") :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '/FILE/!{d;b;};N;s/TRACK/truc/' cue.cue
    Cordialement.

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    L'erreur est le non respect de la "vraie" syntaxe sed (manque un ";") :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '/FILE/!{d;b;};N;s/TRACK/truc/' cue.cue
    Moi, je ne demande qu'à te croire!
    C'est juste mon "sed" qui n'est pas d'accord:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ sed '/FILE/!{d;b;};N;s/TRACK/truc/' cue.cue
    sed: 1: "/FILE/!{d;b;};N;s/TRACK ...": unexpected EOF (pending }'s)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    Bonjour,
    Merci pour les réponses.
    J'essairais sur le mac de ma fille dés que possible mais je ne sais pas si c'est parce que c'est une fille ou parce que c'est un mac, mais l'acces a l'appareil est trés difficile!
    Avec gsed (pkg_add gsed), ça fonctionne correctement.
    Avec le sed de base, ça fonctionne sur 2 lignes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /sed '^FILE/!{d;b
    };N;s/TRACK/truc/' cue.cue
    avec la proposition de disedorgue j'obtiens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sed '/FILE/!{d;b;};N;s/TRACK/truc/' cue.cue
    sed: 1: "/FILE/!{d;b;};N;s/TRACK ...: undefined label ''
    Cordialement.

  6. #6
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 285
    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 285
    Points : 12 740
    Points
    12 740
    Par défaut
    Bon, a priori, la commande 'b' demande un label obligatoire aussi (en principe, si non défini, 'b' saute à la fin du code sed, mais là, ça n'a pas l'air d'être le cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '/FILE/!{ d;b xx; };N;s/TRACK/truc/;:xx' cue.cue
    Après, en regardant le man du sed openbsd, je ne suis pas sur que cela fonctionne sur une ligne en séparant les commandes par des ";" (du moins dans le bloc fonction "{....}".

    D'ailleurs, en y regardant de plus près ta commande sed, je ne vois pas pourquoi tu as besoin du 'b', le 'd' le fait implicitement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '/FILE/!d;N;s/TRACK/truc/' cue.cue
    devrait être suffisant.
    Cordialement.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    Le but était de voir si mon script qui fonctionne sur débian fonctionnait aussi sur OpenBSD.
    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
    sed '/FILE/!{d;b}
    :B
    {
    $!N
    s/\(.* "\)\(.*\)\([0-9][0-9]\)\(.*\n.* \)\([0-9]*\)\( .*\)/\1\2\3\4\3\6/;s/\(.*\n.* \)\([0-9] \)\(.*\)/\1\0\2\3/}
    :A
    s/\n$//
    h
    $!{N
    /\nFILE/{x
    s/\n/|/g
    p
    x
    s/.*\n\(FILE.*\)/\1/
    bB
    }
    bA
    }
    s/\n/|/g' "$1" | sort -t \| -k 2 | sed 's/|/\n/g'
    comme j'obtenais une erreur unexpected EOF (pending }'s)
    j'ai reduit le script et le fichier de test pour essayer de comprendre.
    Et effectivement, apparemment il faut un saut de ligne avant le } de fermeture du bloc fonction.
    Si tu vois une solution alternative ?
    Cordialement.

  8. #8
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 285
    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 285
    Points : 12 740
    Points
    12 740
    Par défaut
    Je persiste, le d est suffisant à lui même:
    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
    sed '/FILE/!d
    :B
    $!N
    s/\(.* "\)\(.*\)\([0-9][0-9]\)\(.*\n.* \)\([0-9]*\)\( .*\)/\1\2\3\4\3\6/
    s/\(.*\n.* \)\([0-9] \)\(.*\)/\1\0\2\3/
    :A
    s/\n$//
    h
    $!{ N
    /\nFILE/{ x
    s/\n/|/g
    p
    x
    s/.*\n\(FILE.*\)/\1/
    b B
    }
    b A
    }
    s/\n/|/g' "$1" | sort -t \| -k 2 | sed 's/|/\n/g'
    J'ai mis une commande par ligne, rajouté un espace en début de bloc, viré le début et fin de bloc qui ne servait pas à grand chose (après le label ':B' ) et simplifié le "!{d;b}" en '!d'.
    Par contre, je sais que certains sed ne supporte pas des blocs dans des blocs, faut espérer que le sed openbsd le supporte...
    Après, si tu expliques ce que fait (ou doit faire) ce code sed, peut-être que l'on pourrait t'aider à le refaire en plus simple, voir le transformer un quelque chose plus facile à maintenir comme du awk ou autre.
    Cordialement.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    Merci pour ton aide.
    Il y a certainement moyen d'ameliorer mon script.
    Je n'ai pas encore essayer ta proposition.
    Il manque quelque ligne au début.

    Voici l'histoire.
    J'ai fait un "magnifique" programme en C qui liste tous les fichiers flac d'un répertoire et créer un fichier cue en allant extraire avec libflac dans chaque fichier les différent tags "Artiste, Titre, etc ..."
    Il fonctionne mais présente plusieurs défauts qui demande a être repris mais je suis passé au shell et je compense ces défauts en shell.
    Le principal défaut et le but de mon script est d'y remedier.
    Mon programme C lit les fichiers 1 par 1 sans tenir compte de l'ordre numerique des fichiers et me crée un fichier cue qui comporte des lignes du type:
    FILE "P!nk. 2003. Try This-05. Oh My God (Feat. Peaches).flac" WAVE
    TRACK 01 AUDIO
    ARTIST "P!nk"
    TITLE "Oh My God (Feat. Peaches)"
    INDEX 01 00:00:00
    Ici le fichier est indexé 05 alors que le TRACK est 01 car c'est le premier fichier flac qui a été lu dans le répertoire.
    Le but du script est d'accorder les numeros de façon a ce que le TRACK 01 corresponde au fichier 1
    J'essaye maintenant de le faire fonctionner sous OpenBSD.
    Cordialement.

    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
    31
    #!/bin/sh
     
    # La ligne de commande comporte un parametre
     
    [ $# != 1 ] && { echo "Il faut 1 et 1 seul parametre" ; exit ;}
     
    #ici, on n'affiche que les lignes d'en-tete
     
    sed -n '/FILE/q;p' "$1"
     
    #ici, on supprime les lignes d'en-tete puis on traite les lignes qui restent
     
    sed '/FILE/!{d;b}
    :B
    {
    $!N
    s/\(.* "\)\(.*\)\([0-9][0-9]\)\(.*\n.* \)\([0-9]*\)\( .*\)/\1\2\3\4\3\6/;s/\(.*\n.* \)\([0-9] \)\(.*\)/\1\0\2\3/}
    :A
    s/\n$//
    h
    $!{N
    /\nFILE/{x
    s/\n/|/g
    p
    x
    s/.*\n\(FILE.*\)/\1/
    bB
    }
    bA
    }
    s/\n/|/g' "$1" | sort -t \| -k 2 | sed 's/|/\n/g'

  10. #10
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 285
    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 285
    Points : 12 740
    Points
    12 740
    Par défaut
    L'exemple est un peu court, mais si c'est représentatif, un exemple:
    le fichier:
    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
    $ cat /tmp/xx.xx 
    FILE "P!nk. 2003. Try This-05. Oh My God (Feat. Peaches).flac" WAVE
    TRACK 01 AUDIO
    ARTIST "P!nk"
    TITLE "Oh My God (Feat. Peaches)"
    INDEX 01 00:00:00
    FILE "P!nk. 2003. Try This-02. Hh My God (Feat. Peaches).flac" WAVE
    TRACK 02 AUDIO
    ARTIST "P!nk"
    TITLE "Oh My God (Feat. Peaches)"
    INDEX 02 00:00:00
    FILE "P!nk. 2003. Try This-01. Gh My God (Feat. Peaches).flac" WAVE
    TRACK 03 AUDIO
    ARTIST "P!nk"
    TITLE "Oh My God (Feat. Peaches)"
    INDEX 03 00:00:00
    La transformation:
    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
    $ sed 's/^FILE/\r&/' /tmp/xx.xx | tr "\n" "|" | tr "\r" "\n" | sed '1d;s/\([0-9][0-9]\)\([^0-9]*\)[0-9][0-9] /\1\2\1 /g; s/|$//' | sort -t \| -k 2 | tr "|" "\n"
    FILE "P!nk. 2003. Try This-01. Gh My God (Feat. Peaches).flac" WAVE
    TRACK 01 AUDIO
    ARTIST "P!nk"
    TITLE "Oh My God (Feat. Peaches)"
    INDEX 03 00:00:00
    FILE "P!nk. 2003. Try This-02. Hh My God (Feat. Peaches).flac" WAVE
    TRACK 02 AUDIO
    ARTIST "P!nk"
    TITLE "Oh My God (Feat. Peaches)"
    INDEX 02 00:00:00
    FILE "P!nk. 2003. Try This-05. Oh My God (Feat. Peaches).flac" WAVE
    TRACK 05 AUDIO
    ARTIST "P!nk"
    TITLE "Oh My God (Feat. Peaches)"
    INDEX 01 00:00:00
    La première partie (sed|tr|tr) est là pour éviter d'avoir une seule grande ligne à traiter par le sed principal (car certain sed ont une limite quand à la taille d'une ligne).
    Cordialement.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    Bonjour,
    Merci pour les suggestions.
    Je suis finalement arrivé a ce que je voulais.
    Pour info le sed openbsd accepte la commande b mais elle doit finir la ligne.
    ne fonctionne pas.
    Il faut remplacer le \r par ctrlVM.
    Cordialement.

  12. #12
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Décidément, je trouve le langage de "sed" vraiment barbare très difficile à lire et maîtriser...
    Si j'avais dû faire ton exercice, je l'aurais probablement fait avec "awk"!
    De mon point de vue, on a un langage de programmation qui ressemble à un vrai langage un langage proche de ceux que je connais déjà (java, C, etc.), avec des fonctions clairement nommées, où on peut choisir un nom explicite pour ses variables, où on peut mettre des commentaires...
    Évidemment, cet avis n'engage que moi! ;-)

Discussions similaires

  1. Serveur WEB sous OpenBSD
    Par SYNACK dans le forum BSD
    Réponses: 1
    Dernier message: 10/11/2009, 13h03
  2. Modifier la couleur des messages sous OpenBSD
    Par tsing dans le forum BSD
    Réponses: 0
    Dernier message: 16/05/2009, 14h50
  3. Commande exit sous OpenBSD
    Par Olivier Regnier dans le forum BSD
    Réponses: 1
    Dernier message: 04/09/2008, 13h27
  4. Sed sous AIX
    Par dvi24 dans le forum AIX
    Réponses: 2
    Dernier message: 25/06/2008, 19h32
  5. Proxy sous openbsd
    Par edouard21 dans le forum Réseau
    Réponses: 2
    Dernier message: 12/12/2005, 17h23

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