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

Aller un peu plus loin avec sed..


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 138
    Points : 65
    Points
    65
    Par défaut Aller un peu plus loin avec sed..
    Bonsoir à tous!
    Après pas mal de docs sur sed je commence à comprendre plus ou moins:
    J'ai un fichier toto.txt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    AZERTY QWERTY
    AZERTY QWERTY
    AZERTY QWERTY
    j'ai un fichier titi.txt:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    QWERTY AZERTY 
    QWERTY AZERTY 
    QWERTY AZERTY
    je lance ma commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i 's/ //g' [FIC] | tr -d '\n' > test.txt
    Le résultat est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AZERTYQWERTYAZERTYQWERTYAZERTYQWERTYQWERTYAZERTYQWERTYAZERTYQWERTYAZERTY
    Le problème c'est qu'il me colle tout , moi je voudrais avoir plutôt ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AZERTYQWERTYAZERTYQWERTYAZERTYQWERTY
    QWERTYAZERTYQWERTYAZERTYQWERTYAZERTY
    OS: Solaris ( UNIX ksh)

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 585
    Points : 19 462
    Points
    19 462
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sed -s ':flag;N;s/ \|\n//g;bflag' toto.txt titi.txt
    AZERTYQWERTYAZERTYQWERTYAZERTYQWERTY
    QWERTYAZERTYQWERTYAZERTYQWERTYAZERTY
    fonctionne avec GNU sed, peut-être pas avec un autre
    ...
    ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 138
    Points : 65
    Points
    65
    Par défaut
    Je vais éssayer

    Par contre le sed :'flag;N;s/\n/ /;bflag' [ FIC ] ne fonctionne pas sur Sun
    alors je sais pas si celle la va fonctionner ;-(

  4. #4
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    Essaye en séparant chaque instruction avec l'option "-e" et en ne mettant qu'une seule lettre comme étiquette (certaines versions de Sed sont sensibles au nombre de lettres dans une étiquette) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -s -e ':z' -e 'N' -e 's/ \|\n//g' -e 'bz' fichier1 fichier2
    Essaye aussi en mettant les instructions dans un fichier et en appelant ledit fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    cat script.sed
    :z
    N
    s/ \|\n//g
    b z
    
    sed -s -f script.sed fich1 fich2

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 138
    Points : 65
    Points
    65
    Par défaut
    Aucune des commandes ne marchent sur mon SUN
    aucun résultat ou message d'erreur type sed: command garbled

  6. #6
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Alors essaye comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -s -e ':z; N; s/ \|\n//g; bz' fichier1 fichier2
    En respectant les espaces après chaque point-virgule...

  7. #7
    Membre habitué Avatar de nowahn
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 84
    Points : 150
    Points
    150
    Par défaut
    Bonjour,

    L’option -s de sed semble être une extension GNU.
    Tu peux t’en passer en faisant une commande par fichier :
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SedCommand=':flag;N;s/ \|\n//g;bflag'
    sed "${SedCommand}" toto.txt > test.txt
    sed "${SedCommand}" titi.txt >> test.txt
    ou quelque chose du genre :
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SedCommand=':flag;N;s/ \|\n//g;bflag'
    (sed "${SedCommand}" toto.txt ; sed "${SedCommand}" titi.txt) > test.txt

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 138
    Points : 65
    Points
    65
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sed -s -e ':z; N; s/ \|\n//g; bz' fichier1 fichier2
    sed: illegal option -- s
     
    sed -e ':z; N; s/ \|\n//g; bz' fichier1 fichier2
    Label too long: :z; N; s/ \|\n//g; bz

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 138
    Points : 65
    Points
    65
    Par défaut
    marche pas non plus

    cela ne m'enlève pas les retours chariots

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 138
    Points : 65
    Points
    65
    Par défaut
    C'est bon j'ai trouvé l'astuce avec l'aide d'un collègue
    je vous l'écrit ce soir

  11. #11
    Membre chevronné

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut
    Citation Envoyé par ghostrider95 Voir le message
    sed -s -e ':z; N; s/ \|\n//g; bz' fichier1 fichier2
    sed: illegal option -- s

    sed -e ':z; N; s/ \|\n//g; bz' fichier1 fichier2
    Label too long: :z; N; s/ \|\n//g; bz

    Comme indiqué par zipe31, il faut sortir le :z

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e ':z' -e'N' -e's/ \|\n//g' -e 'bz'
    mais bon, ça t'arrange pas vu que tu veux une seule commande sans boucle j'imagine

  12. #12
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    Citation Envoyé par Alek-C Voir le message
    Membre éclairé

    Il faut sortir le :z

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e ':z' -e'N' -e's/ \|\n//g' -e 'bz'
    Tu ne devais pas être bien éclairé

  13. #13
    Membre chevronné

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Salut,
    Tu ne devais pas être bien éclairé
    Sisi, mais dans les exemples de ghostrider95, il n'avait pas suivi tes recommandations, donc j'en remettais une couche (mais il est vrai que j'ai oublié de te citer c'est réparé, toutes mes excuses !)

    Sinon, j'ai une solution avec awk je pense :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'NR==1 {printf "%s",$0} NR!=1&&FNR==1 {printf "\n%s",$0 } FNR!=1 {printf "%s",$0} END {printf "\n"}' *.txt
    le premier print et le dernier sont plus là pour faire joli qu'autre chose (sans eux, il y a respectivement une ligne blanche au début et pas de saut de ligne à la fin)...

    Ca devrait marcher partout non ?

  14. #14
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Citation Envoyé par Alek-C Voir le message
    Sisi, mais dans les exemples de ghostrider95, il n'avait pas suivi tes recommandations, donc j'en remettais une couche (mais il est vrai que j'ai oublié de te citer c'est réparé, toutes mes excuses !)
    Mais je vous en prie, mais ce n'était pas souligné dans ce sens là

    Sinon, avec "sed" et sans boucle, on peut utiliser les mémoires principales et secondaires....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n -e 1h -e '1!H' -e '${x;s/\n/ /gp;}'

  15. #15
    Membre chevronné

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut
    ça marche pas ça si ?
    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
    ~
    $ cat toto.txt
    QWERTY AZERTY
    QWERTY AZERTY
    QWERTY AZERTY
    toto
    ~
    $ cat titi.txt
    AZERTY QWERTY
    AZERTY QWERTY
    AZERTY QWERTY
    titi
    ~
    $ sed -n -e 1h -e '1!H' -e '${x;s/\n/ /gp;}' *.txt
    AZERTY QWERTY AZERTY QWERTY AZERTY QWERTY titi QWERTY AZERTY  QWERTY AZERTY  QWERTY AZERTY toto

  16. #16
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Ben non, pas sur plusieurs fichiers, à moins de rajouter l'option "-s", mais comme notre ami n'a pas cette option dans sa version de "sed", je n'en ai pas parlé

  17. #17
    Membre chevronné

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut
    on est d'accord

    cela étant, on a toujours pas la solution qu'il a trouvé avec son collègue !

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 138
    Points : 65
    Points
    65
    Par défaut
    Bonsoir!
    Désolé du retard

    Voici la solution de mon collègue qui fonctionne sous mon SunOS:

    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
    #############################################
     
    FIC=/chemin/t*
    # chemin ou sont stockés "mes fichiers" toto.txt et titi.txt
    FIC2=/chemin/new_fichier
     
    #Initialise le fichier $FIC2 vide
    > $FIC2
     
     
     
    for fic in $(ls -1 $FIC)
    do
      sed 's/ //g' $fic | tr -d '\n' >> $FIC2
      echo  >> $FIC2
     
    done

  19. #19
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    Merci pour le complément d'info.

    Par contre ce n'est pas trop en adéquation avec ton titre et tu n'es guère plus avancé qu'en arrivant

  20. #20
    Membre chevronné

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut
    Ben à priori, il n'existe pas de moyen pour faire ça dans sed sous SunOS vu qu'il manque des options

    Sinon, et comme dirait N_BaH, on ne fait pas for item in $(command); surtout pas ls. parce que

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

Discussions similaires

  1. Défi : Toutes les semaines un peu de code pour aller plus loin avec Windows 7
    Par Jérôme Lambert dans le forum Développement Windows
    Réponses: 41
    Dernier message: 05/01/2012, 12h00
  2. [RDFa] Pour aller plus loin avec RDFa
    Par dourouc05 dans le forum Web sémantique
    Réponses: 0
    Dernier message: 23/05/2011, 10h12
  3. Aller plus loin avec la sérialisation XML
    Par tomlev dans le forum Général Dotnet
    Réponses: 6
    Dernier message: 04/10/2009, 17h53
  4. Réponses: 4
    Dernier message: 21/08/2009, 14h57

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