Bonjour,
j'essaie actuellement de créer un script sous GNU/Linux qui puisse faire ceci :

1) Le script (qui est placé dans un répertoire avec plein de fichiers différents) trouve uniquement les fichiers nommés article*.html (par exemple article33.html, article 1.html, etc.).

2) Sur chacun de ces fichiers, il exécute l'action suivante : trouver tous les <div id="pied"> et supprimer la ligne du <div id="pied"> ainsi que tout ce qu'il contient jusqu'à </div> (</div> doit être supprimé aussi).

Remarque : Si possible, le résultat pourrait être posté dans un dossier différent (le résultat contiendrait donc plein de fichiers du type article13.html .
Remarque 2 : Je ne sais pas trop comment faire, mais ça serait bien que les div qui soient dans les divs n'arrête pas la suppressions des lignes au mauvais endroit (lorsqu'il tombe sur le </div> d'un div imbriqué par exemple). Pour cela, en y réfléchissant bien, je pense qu'il faudrait une sorte de variable $i qui s'incrémente lorsqu'elle trouve une ouverture de div, et lorsqu'un div "fermant" est trouvé, on le passe parce que $i est supérieur à zéro, et on décrémente aussitôt $i. Un div fermant arrêterait a suppression des lignes uniquement si $i vaut 0. Valeur initiale de $i, zéro.

Voilà si quelqu'un a une idée.

Merci.
Je vous envoie déjà une idée de script qu'on m'a fait (personnellement, ayant fait un peu de PHP, je n'ai pas compris les boucles, etc.) :
#!/bin/sh
for page in `find /dossier/de/départ -name "article*.html"`; do
debut=`grep -n "<div id=\"pied\">" $page | awk -F":" '{print $1}'`
liste=`grep -n "</div>" $page | awk -F":" '{print $1}'`
for i in $liste
do
if test $i -ge $debut
then
        fin=$i
fi
done
echo $debut
echo $fin
sed -e '$debut,${vraiefin}d' $page
done
Merci d'avance.
pour faire ce que tu veux (surtout pour gérer proprement les <div> imbriquées)
j'ai trouvé que dans la bibliothèque qui va avec perl (CPAN) existe un module
qui permet de créer un arbre à partir d'un fichier html. De cet arbre, tu pourras
couper la branche qui ne t'intéresse pas, puis sortir le reste sous forme HTML
Voir ici
for f in $(find . -name '*.html') ; do 
   awk 'BEGIN { i = 0 } ; 
   {
      if ( i == 1 ) {
         if ( $0 == "</div>" ) {
            i = 0
         }
      } else {
         if ( $0 == "<div id=\"pied\">" ) {
            i = 1
         } else {
            print $0
         }
      }
   }' $f > $f.new
done
ça gère pas les <div bidule> a l'interieur d'un <div pied>...
Tob
Merci, mais j'ai essayé ce script, et ça ne semble pas fonctionner...
Quand je l'exécute :
./script2.sh
Je n'ai aucun message d'erreur en console.
Mais la partie n'est pas supprimée :
    </p></td>
    <td class="shadow_right"> </td>
  </tr>
<div id="pied">
<p>Ligne d'exemple à supprimer.</p>
<p>Ligne d'exemple 2 à supprimer.</p>
</div>
</table>
</body>
</html>
C'est dans le fichier article33.html

Sinon, je ne comprend pas bien le fonctionnement du script...
Ça n' vraiment rien avoir avec du PHP... :S

Merci encore.
tabasseur wrote:Merci, mais j'ai essayé ce script, et ça ne semble pas fonctionner...
Quand je l'exécute :
./script2.sh
Je n'ai aucun message d'erreur en console.
Mais la partie n'est pas supprimée :
    </p></td>
    <td class="shadow_right"> </td>
  </tr>
<div id="pied">
<p>Ligne d'exemple à supprimer.</p>
<p>Ligne d'exemple 2 à supprimer.</p>
</div>
</table>
</body>
</html>
C'est dans le fichier article33.html
sisi ça marche: faut regarder dans le fichier article33.html.new
tabasseur wrote:Sinon, je ne comprend pas bien le fonctionnement du script...
Ça n' vraiment rien avoir avec du PHP... :S
normal: c'est du awk, mais c'est pas tellement different du php en fait.

Le $(find ...) trouve tous les fichiers .html. Le for les met dans $f un à un et lance
le awk dessus.
Awk boucle sur toutes les lignes du fichier et fait ce qu'on lui dit:
avant la premiere ligne mets i a 0: BEGIN { i = 0 }
et pour chaque ligne execute la petite logique qui se sert de i pour
gerer l'etat: dans un div ou pas.

Tob
tabasseur wrote:Merci encore.
de rien
Les fichiers .new sont bien créés, mais je retrouve quand même la partie avec le div à supprimer :
<tr>
<td class="shadow_left"> </td>
<td class="bottom_link_container"><p><a href="#" class="bottom_link">Link</a> | <a href="#" class="bottom_link">Link</a> | <a href="#" class="bottom_link">Link</a> | <a href="#" class="bottom_link">Link</a> | <a href="#" class="bottom_link">Link</a> </p>
<p>All Right Reserved © 2006 by bprizze<br />
http://heartlessg.4uhost.info Web Master
</p></td>
<td class="shadow_right"> </td>
</tr>
<div id="pied">
<p>Ligne d'exemple à supprimer.</p>
<p>Ligne d'exemple 2 à supprimer.</p>
</div>
</table>
</body>
</html>
En tous cas, merci mille fois.
tabasseur wrote:Les fichiers .new sont bien créés, mais je retrouve quand même la partie avec le div à supprimer :

En tous cas, merci mille fois.
C'est bizarre parceque ça marche ici. N'y aurait il pas un espace qui traine sur la
ligne <div id="pied"> ? Parceque la il faut que la ligne soit exactement comme ca.

Tob
Ben apparement non, j'ai posté les lignes du fichiers au dessus.

Sinon, j'en demande beaucoup, mais est-ce que tu pourrais commenter au moins rapidement les lignes de ton programme ?
Parce qu'à part le find, je ne comprend pas ce qu'il se passe, ni la manière de procéder.
awk 'BEGIN { i = 0 } ; 
   {
      if ( i == 1 ) {
         if ( $0 == "</div>" ) {
            i = 0
         }
      } else {
         if ( $0 == "<div id=\"pied\">" ) {
            i = 1
         } else {
            print $0
         }
      }
   }' $f > $f.new
done
Remarque : J'ai remplacé la première ligne par :
for f in $(find . -name 'article*.html') ; do
Merci encore.
hmm.. avec awk on pourrait compter dans i le niveau d'imbrication des div et ainsi gérer proprement cette imbrication
tabasseur wrote:Sinon, j'en demande beaucoup, mais est-ce que tu pourrais commenter au moins rapidement les lignes de ton programme ?
Parce qu'à part le find, je ne comprend pas ce qu'il se passe, ni la manière de procéder.
Chouette! une petite relecture de code...

Dans ce petit script awk, i est une variable d'état.

Elle prend deux valeurs:
* 0: la ligne courante traitée pas awk ([c]$0[/c]) est en dehors d'un bloc [c]<div id="pied">...</div>[/c]

Dans cet état, le script analyse si la ligne courante ne serait pas un début de bloc: [c]if ( $0 == "<div id=\"pied\">" ) {[/c]
Si c'est le cas, le script change d'état : [c]i = 1[/c] et la ligne courante n'est pas écrite dans le fichier de sortie
Si ce n'est pas le cas, elle est écrite dans le fichier de sortie [c]print $0[/c]

* 1: la ligne courante est en dans un bloc [c]<div id="pied">...</div>[/c]

Dans cet état, le script analyse si la ligne courante ne serait pas une fin de bloc: [c]if ( $0 == "</div>" ) {[/c]
Si c'est le cas, elle le script repasse à l'état : [c]i = 0[/c]
Dans tous les cas la ligne courante n'est pas écrite dans le fichier de sortie

Ce script pourrait être étendu, dans un premier temps, comme suit:
awk 'BEGIN { i = 0 } ; 
   {
      if ( i > 0 ) {
         if ( $0 == "</div>" ) {
            i--
         } else {
            if ( $0 ~ /^<div .*>$/ ) { # Utilisation d'une expression régulière pour traiter les <div > imbriqués
               i++
            }           
         }
      } else {
         if ( $0 == "<div id=\"pied\">" ) {
            i++
         } else {
            print $0
         }
      }
   }' $f > $f.new
A+
A