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 :

Problème split multi caractères


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 99
    Par défaut Problème split multi caractères
    Bonjour.

    J'ai un problème pour couper un texte sur une chaine de plusieurs caractères.
    Pour faire simple, on tape via wget sur un script qui renvoie un contenu de la sorte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    nom_fichier1
    [CONTENT]contenu_fichier1[/CONTENT]
    [ENDOFILE]
    nom_fichier2
    [CONTENT]contenu_fichier2[/CONTENT]
    [ENDOFILE]
    nom_fichierx
    [CONTENT]contenu_fichierx[/CONTENT]
    [ENDOFILE]
    En sachant que le contenu du fichier peut contenir toutes les lettres de l'alphabet français et espagnol.

    L'idée serait donc de découper via bash sur la chaine [ENDOFILE], lire en ligne 1 le nom du fichier, le créer puis y mettre le contenu présent entre [CONTENT] et [/CONTENT] et que ce contenu peut contenir des espaces, saut de lignes, tabulations etc ...

    IFS ne travaille que sur un seul caractère et la fonction cut également.
    y a-t-il en bash une fonction similaire à explode() en PHP qui solutionnerait très facilement mon problème ?

    Merci

  2. #2
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    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 347
    Par défaut
    Bonjour,
    On manque un peu d'information, comme par exemple est-ce qu'il y a des espaces dans tes nom de fichier ou dans le contenu ?
    Voici déjà un début qui permet d'avoir une ligne pour chaque [ENDOFILE]:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ cat endofile
    nom_fichier1
    [CONTENT]contenu_fichier1[/CONTENT]
    [ENDOFILE]
    nom_fichier2
    [CONTENT]contenu_fichier2[/CONTENT]
    [ENDOFILE]
    nom_fichierx
    [CONTENT]contenu_fichierx[/CONTENT]
    [ENDOFILE]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ paste -s endofile | sed 's/\(\[ENDOFILE\]\)\s*/\1\n/g;s/\n$//'
    nom_fichier1    [CONTENT]contenu_fichier1[/CONTENT]     [ENDOFILE]
    nom_fichier2    [CONTENT]contenu_fichier2[/CONTENT]     [ENDOFILE]
    nom_fichierx    [CONTENT]contenu_fichierx[/CONTENT]     [ENDOFILE]
    Et si pas d'espace, voici un exemple:
    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
    $ while read A B C
    do 
     echo "A: $A"
     echo "B: $B"
     echo "C: $C"
    done < <(paste -s endofile | sed 's/\(\[ENDOFILE\]\)\s*/\1\n/g;s/\n$//')
    A: nom_fichier1
    B: [CONTENT]contenu_fichier1[/CONTENT]
    C: [ENDOFILE]
    A: nom_fichier2
    B: [CONTENT]contenu_fichier2[/CONTENT]
    C: [ENDOFILE]
    A: nom_fichierx
    B: [CONTENT]contenu_fichierx[/CONTENT]
    C: [ENDOFILE]

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

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'BEGIN{RS="\\[ENDOFILE\\]\n"}{split($0,a,"\n\\[CONTENT\\]");sub("\\[/CONTENT\\]\n","",a[2]);print a[2]" >"a[1]}' fichier
    si c'est bon, tu enlèves les " du print.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 99
    Par défaut
    Bonjour.

    Merci de vos réponses.
    On manque un peu d'information, comme par exemple est-ce qu'il y a des espaces dans tes nom de fichier ou dans le contenu ?
    Alors non pas d'espace dans les noms de fichiers par contre, il y en a dans le contenu et ce dernier peut-être sur plusieurs lignes.

    Je vais tester vos solutions et si cela fonctionne, je reviens vers vous.

    Merci

  5. #5
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    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 347
    Par défaut
    Si le contenu est sur plusieurs lignes et avec des espaces, ma solution ne fonctionnera pas.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 99
    Par défaut
    Bonjour.

    J'ai testé vos solutions et cela ne fonctionne pas en effet.
    Devant le temps passé dessus, je me suis résolu à recoder le script en question en PHP. Ca m'a meme pas prit 30 minutes alors que j'ai passé presque 2H à essayer de débloquer cette situation.

    Je reste quand même sur le cul que le langage bash ne possède pas une fonction explode comme en PHP ... Cut ferait l'affaire mais il en fonctionne que sur un seul caractère

    Merci quand même

Discussions similaires

  1. Réponses: 5
    Dernier message: 04/09/2005, 12h34
  2. [SAX] Problème avec les caractères spéciaux
    Par abdou.sahraoui dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 18/07/2005, 10h07
  3. Réponses: 2
    Dernier message: 11/07/2005, 23h54
  4. [ToolTip] Problème avec le caractère "\n"
    Par thomas_strass dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 30/09/2004, 09h19
  5. problème avec le caractère saut de ligne ...
    Par vbcasimir dans le forum Administration
    Réponses: 2
    Dernier message: 17/06/2004, 16h35

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