Discussion: sed sous OpenBSD 6

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    août 2010
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2010
    Messages : 117
    Points : 151
    Points
    151

    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
    Membre expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    avril 2008
    Messages
    1 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : avril 2008
    Messages : 1 474
    Points : 3 917
    Points
    3 917

    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 confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    décembre 2012
    Messages
    2 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Finance

    Informations forums :
    Inscription : décembre 2012
    Messages : 2 086
    Points : 5 819
    Points
    5 819

    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
    Membre expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    avril 2008
    Messages
    1 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : avril 2008
    Messages : 1 474
    Points : 3 917
    Points
    3 917

    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 habitué
    Profil pro
    Inscrit en
    août 2010
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2010
    Messages : 117
    Points : 151
    Points
    151

    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 confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    décembre 2012
    Messages
    2 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Finance

    Informations forums :
    Inscription : décembre 2012
    Messages : 2 086
    Points : 5 819
    Points
    5 819

    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 habitué
    Profil pro
    Inscrit en
    août 2010
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2010
    Messages : 117
    Points : 151
    Points
    151

    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 confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    décembre 2012
    Messages
    2 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Finance

    Informations forums :
    Inscription : décembre 2012
    Messages : 2 086
    Points : 5 819
    Points
    5 819

    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 habitué
    Profil pro
    Inscrit en
    août 2010
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2010
    Messages : 117
    Points : 151
    Points
    151

    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 confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    décembre 2012
    Messages
    2 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Finance

    Informations forums :
    Inscription : décembre 2012
    Messages : 2 086
    Points : 5 819
    Points
    5 819

    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 habitué
    Profil pro
    Inscrit en
    août 2010
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2010
    Messages : 117
    Points : 151
    Points
    151

    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
    Membre expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    avril 2008
    Messages
    1 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : avril 2008
    Messages : 1 474
    Points : 3 917
    Points
    3 917

    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, 14h03
  2. Modifier la couleur des messages sous OpenBSD
    Par tsing dans le forum BSD
    Réponses: 0
    Dernier message: 16/05/2009, 15h50
  3. Commande exit sous OpenBSD
    Par Olivier Regnier dans le forum BSD
    Réponses: 1
    Dernier message: 04/09/2008, 14h27
  4. Sed sous AIX
    Par dvi24 dans le forum AIX
    Réponses: 2
    Dernier message: 25/06/2008, 20h32
  5. Proxy sous openbsd
    Par edouard21 dans le forum Réseau
    Réponses: 2
    Dernier message: 12/12/2005, 18h23

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