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

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

    Informations forums :
    Inscription : Octobre 2004
    Messages : 99
    Points : 64
    Points
    64
    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
    http://www.iso-country-code.com Liste des pays traduits dans pleins de langues

  2. #2
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 298
    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 298
    Points : 12 778
    Points
    12 778
    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]
    Cordialement.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 559
    Points : 19 400
    Points
    19 400
    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 du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 99
    Points : 64
    Points
    64
    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
    http://www.iso-country-code.com Liste des pays traduits dans pleins de langues

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

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

    Informations forums :
    Inscription : Octobre 2004
    Messages : 99
    Points : 64
    Points
    64
    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
    http://www.iso-country-code.com Liste des pays traduits dans pleins de langues

  7. #7
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 298
    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 298
    Points : 12 778
    Points
    12 778
    Par défaut
    Aux informations que l'on a du problème, je ne comprends pas ce qui ne fonctionne pas dans la solution de N_BaH...
    Pourrais-tu nous montrer le code php ?
    Cordialement.

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

    Informations forums :
    Inscription : Octobre 2004
    Messages : 99
    Points : 64
    Points
    64
    Par défaut
    Voici le code PHP en question :
    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
     
    $retour = file_get_contents('http://.../get_files2.php');
    $tab_alerte = explode('[ENDOFFILE]', $retour);
     
    foreach ($tab_alerte AS $info_alert)
    {
    	if (!empty($info_alert))
    	{
    		# recuperation du nom du fichier
    		preg_match_all('#(.*\n)\[CONTENT\]#', $info_alert, $match);
    		$fichier = trim($match[1][0]);
    		# recuperation du contenu
    		preg_match_all('#\[CONTENT\](.*)\[/CONTENT\]#', $info_alert, $match2);
    		$contenu = $match2[1][0];
    		# enregistrement du fichier dans le repertoire de l'alerte pour traitement
    		file_put_contents($fichier, $contenu);
    	}
    }
    Je rappelle que le contenu entre [CONTENT] et [/CONTENT] peut-être sur plusieurs lignes
    http://www.iso-country-code.com Liste des pays traduits dans pleins de langues

  9. #9
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 298
    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 298
    Points : 12 778
    Points
    12 778
    Par défaut
    Je ne vois toujours pas pourquoi la solution de N_BaH ne fonctionne pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $ cat endofile
    nom_fichier1
    [CONTENT]contenu_fichier1
    aaa titi tutu
    bbb tata ddd yyy
    [/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
    5
    6
    7
    8
    9
    10
    11
    12
    $ awk 'BEGIN{RS="\\[ENDOFILE\\]\n"}{split($0,a,"\n\\[CONTENT\\]");sub("\\[/CONTENT\\]\n","",a[2]);print a[2] >a[1]}' endofile
    $ ls
    endofile  nom_fichier1  nom_fichier2  nom_fichierx
    $ cat nom_fichier1
    contenu_fichier1
    aaa titi tutu
    bbb tata ddd yyy
     
    $ cat nom_fichier2
    contenu_fichier2
    $ cat nom_fichierx
    contenu_fichierx
    Cordialement.

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