Decouper un fichier avec des "motifs"

Résolu
Poireau007 Messages postés 85 Statut Membre -  
zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour tout le monde,

Je souhaiterais :
1/ ouvrir un fichier
2/ le découper
3/ enregistrer les fichiers découpés avec le bon nom

Exemple de fichier source :

<h1>Mon titre 1</h1>
<h2>mini titre 1</h2>
texte blablablablablabla
blablablablablablablabla

<h1>Mon titre 2</h1>
<h2>mini titre 2</h2>
texte blablablablablabla
blablablablablablablabla

<h1>Mon titre 3</h1>
<h2>mini titre 3</h2>
texte blablablablablabla
blablablablablablablabla



1/ Ouvrir le fichier : je fais un cat fichier ...
2/ Le découper de "<h1>" jusqu'à la fin du texte : c'est la que je commence à bloquer
je fais perl -0777 -ne 'print "$1\n" while /<h1>(.*?)<h1>(.*?)<h1>/gs' fichier
(fonction trouvée sur internet que je ne comprend pas trop...)

Je récupére une partie de mes article mais pas tous :(

3/Découpage. Je pensais garder mes h1 pour renommer...
par exemple for i in $(grep h1 fichier);do touch $1; done
et ensuite mettre le contenu dedans, mais bon je sais pas si c'est la bonne approche...

Si quelqu'un a des pistes, je suis preneur !

3 réponses

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
     
    Salut,

    $ ls     # Contenu du répertoire
    foo.sh  plop
    
    $ cat plop      # Contenu du fichier "plop"
    <h1>Mon titre 1</h1>
    <h2>mini titre 1</h2>
    texte blablablablablabla
    blablablablablablablabla
    
    <h1>Mon titre 2</h1>
    <h2>mini titre 2</h2>
    texte blablablablablabla
    blablablablablablablabla
    
    <h1>Mon titre 3</h1>
    <h2>mini titre 3</h2>
    texte blablablablablabla
    blablablablablablablabla
    
    $ cat foo.sh      # Le script "foo.sh"
    #! /bin/bash
    
    while read line
    do
    sed -n '/'"${line}"'/,/^$/w '"${line// /_}"'' plop
    done < <(sed -n '/<h1>/ s/<[^>]*>//gp' plop)
    
    
    $ ./foo.sh      # Exécution
    
    $ ls     # Contenu du répertoire
    foo.sh  Mon_titre_1  Mon_titre_2  Mon_titre_3  plop
    
    $ head Mon*     # Contenu des fichiers créés
    ==> Mon_titre_1 <==
    <h1>Mon titre 1</h1>
    <h2>mini titre 1</h2>
    texte blablablablablabla
    blablablablablablablabla
    
    
    ==> Mon_titre_2 <==
    <h1>Mon titre 2</h1>
    <h2>mini titre 2</h2>
    texte blablablablablabla
    blablablablablablablabla
    
    
    ==> Mon_titre_3 <==
    <h1>Mon titre 3</h1>
    <h2>mini titre 3</h2>
    texte blablablablablabla
    blablablablablablablabla
    
    $

    1
  2. Poireau007 Messages postés 85 Statut Membre 15
     
    Salut Zipe31,
    merci pour ta réponse

    quand j'execute ta commande, j'ai ce message :

    foo.sh: line 6: syntax error near unexpected token '<'
    foo.sh: line 6: 'done < <(sed -n '/<h1>/ s/<[^>]*>//gp' plop.txt)'
    


    j'ai essayer de retirer l'espace entre les "<" mais c'est pas ça

    Sinon pour executer le shell chez moi je fais plutôt :
    sh foo.sh

    car je suis sous mac
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
       
      Sinon pour executer le shell chez moi je fais plutôt : sh foo.sh
      C'est un lien symbolique sh ?

      Sinon, essaye avec :

      done < $(sed -n '/<h1>/ s/<[^>]*>//gp' plop.txt)
      0
    2. Poireau007 Messages postés 85 Statut Membre 15
       
      sh + blabla.sh : ça permet d'executer un sh dans le dossier en cours.

      Avec ta modif il me dit :

      foo.sh: line 6: Mon titre 1
      Mon titre 2
      Mon titre 3: No such file or directory
      


      :(

      le "<" c'est pour sortir le document ?
      0
    3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
       
      Modifie le script comme ça :

      #! /bin/bash
      
      sed -n '/<h1>/ s/<[^>]*>//gp' plop | while read line
      do
      sed -n '/'"${line}"'/,/^$/w '"${line// /_}"'' plop
      done


      Par contre rends ton script exécutable :
      chmod u+x foo.sh

      et lance-le comme suit :
      ./foo.sh
      0
    4. Poireau007 Messages postés 85 Statut Membre 15
       
      Ca marche ! Merci !!

      Ok pour le chmod ça marche aussi.
      Pour comprendre ça change quoi de faire comme ça ?
      0
    5. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
       
      C'est surtout que le shebang (#! /bin/bash) est interprété de cette façon, sans quoi c'est "/bin/sh" qui interprète le script ;-\
      0
  3. Dig
     
    Bonjour à vous,
    J'essaye de m'inspirer sans trop se succès de cette solution pour découper un énorme fichier (dump de postgresql) à chaque occurence du mot COPY en début de ligne.

    J'ai changé les /<H1>/ en /COPY/ mais je dois avouer ne pas comprendre vraiment la syntaxe.

    Merci par avance, surtout à Zipe31 si vous pouvez m'aider.

    Salutations
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
       
      Salut,

      Merci d'ouvrir un nouveau post en expliquant au mieux ton problème et surtout en donnant un exemple concret AVANT => APRÈS de ce que tu attends.
      0