Decouper un fichier avec des "motifs"

Résolu/Fermé
Poireau007 Messages postés 83 Date d'inscription jeudi 5 février 2009 Statut Membre Dernière intervention 17 octobre 2012 - 17 oct. 2012 à 17:10
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 - 30 oct. 2012 à 08:20
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 !
A voir également:

3 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
17 oct. 2012 à 17:26
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
Poireau007 Messages postés 83 Date d'inscription jeudi 5 février 2009 Statut Membre Dernière intervention 17 octobre 2012 15
17 oct. 2012 à 17:42
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
17 oct. 2012 à 17:47
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
Poireau007 Messages postés 83 Date d'inscription jeudi 5 février 2009 Statut Membre Dernière intervention 17 octobre 2012 15
17 oct. 2012 à 18:57
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
17 oct. 2012 à 19:12
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
Poireau007 Messages postés 83 Date d'inscription jeudi 5 février 2009 Statut Membre Dernière intervention 17 octobre 2012 15
17 oct. 2012 à 19:18
Ca marche ! Merci !!

Ok pour le chmod ça marche aussi.
Pour comprendre ça change quoi de faire comme ça ?
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
17 oct. 2012 à 19:20
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
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
30 oct. 2012 à 08:20
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