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 :

[ksh] Ajouter un retour chariot


Sujet :

Shell et commandes GNU

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 81
    Par défaut [ksh] Ajouter un retour chariot
    Bonjour,

    J'ai une chaine #TOTO #TITI #TUTU #TATA...
    Je voudrais qu'à partir du deuxième #, il y'ait une retour à la ligne avant chacun des # suivants, ce qui donnerait
    #TOTO
    #TITI
    #TUTU
    #TATA
    ...

    NB : le nombre de # n'est pas fixe.

    J'ai déjà essayé avec un sed 's/#/\\\n/g' mais le \n n'est pas interprété j'obtiens \n#TOTO \n#TITI \n#TUTU \n#TATA

    Merci d'avance

  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,


  3. #3
    Membre très actif

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

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

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    Question con: dans ton exemple, tu n'as pas d'espaces dans les textes, c'est le cas aussi dans ta vraie chaine ?

    Si oui, tu peux utiliser tr:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ echo "#TOTO #TITI #TUTU #TATA" | tr ' ' '\n'
    #TOTO
    #TITI
    #TUTU
    #TATA
    Sinon, la solution de zipe31 est la plus simple

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 81
    Par défaut
    Merci à tous les deux!
    Par contre, seule la solution marche chez moi, ça vient peut être de mon ksh qui est une ancienne version... Voici le résultat que ça donne

    #TOTOn#TITIn#TUTUn#TATA

    Je vais donc prendre la solution de Alek-C qui me convient parfaitement

  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 Cj_Dal Voir le message
    Par contre, seule la solution avec "tr" marche chez moi, ça vient peut être de mon ksh qui est une ancienne version... Voici le résultat que ça donne

    #TOTOn#TITIn#TUTUn#TATA
    Quel système ?
    Quelle version de ksh ?
    Quelle version de sed ?

    Avec ksh93 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ echo "#TOTO #TITI #TU TU #TA TA" | sed 's/ \(#\)/\n\1/g'
    #TOTO
    #TITI
    #TU TU
    #TA TA
    $

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 81
    Par défaut
    En fait j'ai dit une bétise la solution de Alek-C ne va pas marcher lorsque j'aurais des chaînes de caractère avec des espaces à la place des TOTO...

    Sinon :
    Quel système ? AIX Version 5.3
    Quelle version de ksh ? je ne sais pas comment on la trouve
    Quelle version de sed ? je ne sais pas comment on la trouve

  7. #7
    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 Cj_Dal Voir le message
    Quelle version de ksh ? je ne sais pas comment on la trouve
    Quelle version de sed ? je ne sais pas comment on la trouve
    Essaye :

    ksh -v
    sed -v

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 81
    Par défaut
    C'est essayé déjà mais ça marche pas

  9. #9
    Membre expérimenté
    Homme Profil pro
    Gérant infopsylon
    Inscrit en
    Juin 2010
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Gérant infopsylon
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 215
    Par défaut
    Bonjour

    Essais ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    VAR="#TOTO #TITI #TUTU #TATA"
     
    OLD_IFS="$IFS"
    export IFS="#"
     
    for i in $VAR ; do echo "#$i" ; done
     
    export IFS="$OLD_IFS"
    Lilian.

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 81
    Par défaut
    Merci Lilian on s'en rapproche ça me donne :
    #
    #TOTO
    #TITI
    #TUTU
    #TATA

    Pour info, à quoi sert la variable IFS?

  11. #11
    Membre expérimenté
    Homme Profil pro
    Gérant infopsylon
    Inscrit en
    Juin 2010
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Gérant infopsylon
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 215
    Par défaut
    Cj_dal,

    La variable IFS représente le séparateur de champs, par défaut elle contient l'espace, le retour chariot (et le tab ?).
    Tu peux la modifier pour utiliser d'autres séparateurs, en l’occurrence pour toi le #

    Dans le cas de ce que je t'ai donné, la première ligne s'explique parce que la variable commence par un séparateur. Pour le résoudre il faut donc que tu élimines les lignes contenant uniquement #

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    VAR="#TOTO #TITI #TUTU #TATA"
    
    OLD_IFS="$IFS"
    export IFS="#"
    
    for i in $VAR ; do echo "#$i" ; done |sed -e '/^\#$/d'
    
    export IFS="$OLD_IFS"
    Lilian.

  12. #12
    Membre expérimenté
    Homme Profil pro
    Gérant infopsylon
    Inscrit en
    Juin 2010
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Gérant infopsylon
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 215
    Par défaut
    Lorsque tu dis que l'on se rapproche, que te manque-t-il ?

    Lilian.

  13. #13
    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
    Et avec "awk" ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ echo "#TOTO #TITI #TU TU #TA TA" | awk '{ gsub(" #","\n#",$0) ; print $0 }'
    #TOTO
    #TITI
    #TU TU
    #TA TA

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 81
    Par défaut
    Merci à tous ça marche correctement avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo "#TOTO #TITI #TUTU #TATA" | sed 's/\(#\)/\<ENTREE>
    \1/g' | sed '1d'
    La dernière solution de lilian_h marche également

    Bonne fin de journée

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 713
    Par défaut
    Bonjour,

    avec ksh93 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ var="#TOTO #TITI #TUTU #TATA"
    $ IFS=' #' read -A Array <<<"$var"
    $ printf '#%s\n' "${Array[@]:1}"
    #TOTO
    #TITI
    #TUTU
    #TATA

  16. #16
    Membre très actif

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

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

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    Sinon, quand je bosse sur de l'AIX/HPUX/... j'utilise souvent perl pour éviter de me prendre la tête

    Perl est presque toujours installé partout, fonctionne à peu près toujours pareil sur les trucs de base, permet d'écrire un programme simple très rapidement et reste assez efficace en terme de performances... exemple sur 1'000'000 de mots créés avec Les infos sur le fichier d'exemple et sa création (1ère ligne):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ perl -e '@t=("TOTO", "TITI", "TU TU", "TA TA"); for ($i=0; $i<1000000; $i++) {print "#".$t[int(rand($#t+1))]," ";} print "#END\n";' > test_saut.txt
    $ cut -c1-50 test_saut.txt #pour vérifier qu'il a le format attendu ;)
    #TU TU #TA TA #TA TA #TITI #TITI #TA TA #TOTO #TOT
    $ wc test_saut.txt #nombre de mots
          1 1499911 6499915 test_saut.txt
    $ du -h test_saut.txt #taille du fichier
    6.3M    test_saut.txt
    Le traitement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    $ perl -ne 's/ #/\n#/g; print' test_saut.txt > result_perl_saut.txt
    $ head result_perl_saut.txt
    #TU TU
    #TA TA
    #TA TA
    #TITI
    #TITI
    #TA TA
    #TOTO
    #TOTO
    #TA TA
    #TITI
    Et en terme de perfs, c'est correct :
    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
    $ time perl -ne 's/ #/\n#/g; print' test_saut.txt > result_perl_saut.txt
     
    real    0m0.449s
    user    0m0.376s
    sys     0m0.040s
    $ time awk '{ gsub(" #","\n#",$0) ; print $0 }' test_saut.txt > result_awk_saut.txt
     
    real    0m0.410s
    user    0m0.352s
    sys     0m0.036s
    $ time sed 's/\(#\)/\
    \1/g' test_saut.txt | sed '1d' >  result_sed_saut.txt
     
    real    0m0.959s
    user    0m0.920s
    sys     0m0.040s

  17. #17
    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 : 49
    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 Alek-C Voir le message
    Sinon, quand je bosse sur de l'AIX/HPUX/... j'utilise souvent perl pour éviter de me prendre la tête

    $ time sed 's/\(#\)/\
    \1/g' test_saut.txt | sed '1d' > result_sed_saut.txt

    real 0m0.959s
    user 0m0.920s
    sys 0m0.040s
    [/code]
    là forcément avec sed .... | sed ça prend longtemps..

    tu devrais enchainer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sed 's/\(#\)/\
    \1/g;1d' fichier > fichier
    pour gagner un peu de temps. exemple sur un fichier de moins de 1ko
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    [fpu@line ~/tmp] time sed 's/\(#\)/\
    \1/g;1d' a > b
     
    real    0m0.003s
    user    0m0.000s
    sys     0m0.004s
    [fpu@line ~/tmp] time sed 's/\(#\)/\1g' a | sed '1d' > b
    sed: -e expression n°1, caractère 11: commande `s' inachevée
     
    real    0m0.013s
    user    0m0.004s
    sys     0m0.004s
    [fpu@line ~/tmp]
    le gain est plus que manifeste !

  18. #18
    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
    Re-

    du devrais enchainer
    Code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sed 's/\(#\)/\
    \1/g;1d' fichier > fichier
    Le "1d" est inutile si on emploi la bonne syntaxe dans la 1ère expression :

    Il y a un espace en début d'expression

  19. #19
    Membre très actif

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

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

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    Citation Envoyé par frp31 Voir le message
    là forcément avec sed .... | sed ça prend longtemps..
    ...
    sed: -e expression n°1, caractère 11: commande `s' inachevée
    ...
    [/code]
    le gain est plus que manifeste !
    C'est sur qu'avec une erreur, le gain est manifeste :p (désolé)

    En plus, je peux me gourer, mais d'après mes tests, quand tu mets le 1d, ça vire la première ligne ... et le reste :

    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/\(#\)/\
    > \1/g;1d' test_saut.txt | head
    $ sed -e 's/\(#\)/\
    > \1/g' -e1d  test_saut.txt | head
    $ sed -e 's/\(#\)/\
    > \1/g' test_saut.txt | head
     
    > #TU TU
    > #TA TA
    > #TA TA
    > #TITI
    > #TITI
    > #TA TA
    > #TOTO
    > #TOTO
    > #TA TA
    Edit: sinon, j'avais pris cet exemple car c'est celui retenu par notre ami (mais il n'est clairement pas le meilleur selon moi).

    Et pour faire plaisir à zipe31 (qui a cependant entièrement raison, sauf que pour une raison qui restera un mystère, ça ne fonctionne pas chez Cj_Dal) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ time sed 's/ \(#\)/\n\1/g' test_saut.txt > result_sed_saut.txt
     
    real    0m0.725s
    user    0m0.700s
    sys     0m0.024s

  20. #20
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 81
    Par défaut
    Zipe31, pour info, ta solution ne marche pas chez moi, les retours à la ligne ne s'effectuent pas

    Alek-C, on m'a également dit du bien de PERL mais il n'est pas installé sur notre environnement, merci quand même

    frp31, le fait de placer un ;1d dans le premier sed ne m'affiche plus rien... j'ai l'air d'avoir un environnement vraiment particulier

    NB : désolé de pas reprendre les bouts de code, je ne connais pas la balise qu'il faut utiliser

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [TextBlock] Ajouter un retour chariot dans le StringFormat
    Par bassreligion dans le forum Windows Presentation Foundation
    Réponses: 7
    Dernier message: 08/11/2018, 16h14
  2. [RegEx] ajouter un retour chariot à un nombre dans un texte
    Par serna dans le forum Langage
    Réponses: 2
    Dernier message: 06/09/2010, 18h26
  3. concatenation de 2 fichiers+ajout de retour chariot si nécessaire
    Par freestyler dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 14/12/2007, 12h34
  4. [VBA] Comment ajouter un retour chariot dans un label?
    Par fafaf dans le forum VBA Access
    Réponses: 2
    Dernier message: 28/03/2007, 15h37
  5. Réponses: 2
    Dernier message: 11/07/2006, 16h00

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