Fedora-Fr - Communauté francophone Fedora - Linux

Communauté francophone des utilisateurs de la distribution Linux Fedora.

  

Dernière news : Fedora 34 n'est plus maintenu

#1 15/01/2010 01:18:13

tabasseur
???
Inscription : 25/11/2009
Messages : 427

Programme Bash : Supprimmer des balises HTML imbriquées.

Bonsoir,

je fais actuellement un petit programme qui supprime des balises HTML (et qui supprime aussi ce qu'il y a dans ces balises).
J'ai l'intention de supprimer des balises et leurs contenus dans toutes les pages .html nommés spip*.html, contenuent à la racine d'un répertoire.
J'ai donc commencé :

#!/bin/bash
echo 'Ceci est un programme créé pour PCStreet. Ce programme est encore en construction, et doit être utilisé pour faire des tests, UNIQUEMENT.'
read -p 'Etes-vous toujours certain de vouloir lancer ce porgramme sur votre PC (o pour oui, ou n pour non) ? ' commencer
if [ $commencer = o ]
then
    echo "[OK] Vous avez démarré le programme..."
    echo "Vous êtes ici : "`pwd`
    read -p 'Choisissez le répertoire dans lequel se trouve les fichiers à traiter : ' repertoire
        if [ -d $repertoire ]
            then
                    echo "[OK] Le répertoire source $repertoire est un répertoire valide !"
            read -p 'Dans quel répertoire souhaitez-vous copier les fichiers traités ? ' copie
                if [ -d $copie ]
                then
                echo "[OK] Le répertoire $copie est bien un répertoire valide !"
                    for fichier in `ls $repertoire/spip*.html`
                                do
                        echo "Le fichier $fichier est en cours de traitement...".
                        debut=`grep -n "<div id=\"pied\">" $fichier | 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
                else
                echo "[STOP] Le répertoire source $copie n'est pas valide."
                fi
            else
                       echo "[STOP] $repertoire n\est pas un répertoire valide."
            fi
    echo 'Exécution du programme terminée !'     
else
    echo "[STOP] Vous avez arrêté le porgramme, car vous n'avez pas répondu o pour oui."
fi

Voilà, j'ai passé beaucoup de temps à étudier les commandes GNU/Linux, la programmation en bash, et à faire ce programme.
Le problème, c'est que je ne sais pas comment faire l'essentiel (après echo "Le fichier $fichier est en cours de traitement...".). :D
Donc, si quelqu'un à une idée.
J'ai réfléchi, et voilà ce qu'il faudrait faire, d'après moi (je ne sais pas comment faire ça, bien sûr).


>Obtenir la ligne sur laquelle il y a <div id="pied">, et mettre ce numéro dans la variable $debut.
>Initialiser $ligne = $debut, et $niveau = 0.
>Chercher à la ligne suivante (faire $ligne +1), et faire :
    > Si ouverture d'un nouveau div à la ligne $ligne, mettre $niveau à +1, .
    > Sinon, chercher fin d'un div.
           > Si fin d'un div trouvé, faire $niveau -1, et si $niveau vaut 0, suppression de la ligne $debut, à la ligne courante (valeur de $ligne).

# Même chose pour un <div id="menu"> par exemple.

>Obtenir la ligne sur laquelle il y a <div id="menu">, et mettre ce numéro dans la variable $debut.
>Initialiser $ligne = $debut, et $niveau = 0.
>Chercher à la ligne suivante (faire $ligne +1), et faire :
    > Si ouverture d'un nouveau div à la ligne $ligne, mettre $niveau à +1, .
    > Sinon, chercher fin d'un div.
           > Si fin d'un div trouvé, faire $niveau -1, et si $niveau vaut 0, suppression de la ligne $debut, à la ligne courante (valeur de $ligne).

D'avance, je vous remercie pour votre aide.


J'aime GNOME3, j'avoue. :)

Hors ligne

#2 15/01/2010 10:40:19

pingou
Fedora Addict
Lieu : Toulouse
Inscription : 30/03/2006
Messages : 3 843
Site Web

Re : Programme Bash : Supprimmer des balises HTML imbriquées.

Une raison pour bash plutôt qu'un autre langage de prog genre perl ou python?


On a pas inventé l'électricité en cherchant à améliorer la bougie...
-- Si c'est pas sur le bugzilla, c'est pas un bug ! --

Hors ligne

#3 15/01/2010 18:49:47

tabasseur
???
Inscription : 25/11/2009
Messages : 427

Re : Programme Bash : Supprimmer des balises HTML imbriquées.

Mon patron m'a dit :
Ça te permettra de découvrir un peu sed & wk., ainsi que bash.

Si quelqu'un veut que je reposte ce code, mais avec des commentaires, il n'y pas de problèmes.

Quelques questions en plus :
Au passage, je voulais savoir comment utiliser mon KDE4 en root (pour pouvoir copier/coller les répertoires avec des permissions nécessaires).
Sinon, il m'est arrivé quelque chose, en console, j'ai voulu copier/coller un répertoire, mais il me disait "omission du répertoire machin..." alors que j'étais bien en root.

Qu'est-ce que ça signifie ?

D'avance, merci.

Dernière modification par tabasseur (15/01/2010 19:06:08)


J'aime GNOME3, j'avoue. :)

Hors ligne

#4 15/01/2010 19:47:06

bioinfornatics
Membre
Lieu : Paris
Inscription : 08/03/2007
Messages : 3 721
Site Web

Re : Programme Bash : Supprimmer des balises HTML imbriquées.

tabasseur a écrit :

Mon patron m'a dit :
Ça te permettra de découvrir un peu sed & wk., ainsi que bash.

Si quelqu'un veut que je reposte ce code, mais avec des commentaires, il n'y pas de problèmes.

Quelques questions en plus :
Au passage, je voulais savoir comment utiliser mon KDE4 en root (pour pouvoir copier/coller les répertoires avec des permissions nécessaires).
Sinon, il m'est arrivé quelque chose, en console, j'ai voulu copier/coller un répertoire, mais il me disait "omission du répertoire machin..." alors que j'étais bien en root.

Qu'est-ce que ça signifie ?

D'avance, merci.

Waah tu as des compétence en Informatique!!!! se connecter en root en mode graphique !!!!
Bon c'est pas à moi de te faire un cours d'informatique mais voilà quelque règle
1/ on ne se connecte jamais en root en mode graphique
2/ la commande man <mon outil> ou info <mon outil> et ton ami
3/ le net regorge de tuto pour la bash et sed. awk jamais servis car dans ces cas là j'utilise perl ou pyhton

Hors ligne

#5 15/01/2010 20:32:08

Pikachu_2014
Retraité
Lieu : Boulogne-Billancourt
Inscription : 16/06/2005
Messages : 11 334
Site Web

Re : Programme Bash : Supprimmer des balises HTML imbriquées.

Bonsoir,

l'algorithme a l'air correct, et utiliser bash n'est pas un mauvais choix en soi ici, surtout si c'est pour te faire la main avec.
Juste quelques petites remarques pour améliorer ton script qui est déjà pas mal smile :

1) pour gagner un niveau d'imbrication (ton script n'en sera que plus lisible ainsi), je te suggère d'inverser la première condition, celle qui teste la réponse à la question « Êtes-vous toujours certain de vouloir lancer ce programme ... » :

if [ $commencer = o ]
then
 ...
else
   echo "[STOP] Vous avez arrêté le porgramme, car vous n'avez pas répondu o pour oui."
fi

À changer en :

if [ "$commencer" != o ]; then
   echo "[STOP] Vous avez arrêté le porgramme, car vous n'avez pas répondu o pour oui."
   exit
fi

Tu noteras les guillemets rajoutés autour de $commencer, au cas où l'utilisateur s'amuserait à saisir une chaîne avec espaces.
   Tu pourras faire de même quand tu testes la validité du répertoire d'entrée saisi :

if ! [ -d "$repertoire" ]; then
   echo "[STOP] $repertoire n\est pas un répertoire valide."
   exit
fi

Je te laisse deviner pour tester la validité du répertoire de copie ce que tu peux modifier wink

2) À propos de la boucle de parcours des fichiers spip*.html :

for fichier in `ls $repertoire/spip*.html`

Le « ls » ici est à prohiber, il n'y aura pas de gestion des fichiers à espaces avec. Et tant bien même il n'y en aurait pas, la construction suivante est plus élégante... Et plus simple surtout wink

for fichier in "$repertoire"/spip*.html

Ce sont les premières remarques qui me viennent après survol rapide. D'autres commentaires suivront wink


« …elle excitait si puissamment le désir, que je devins alors très incrédule sur sa vertu. »
À propos de Fœdora, dans la Peau de Chagrin (Balzac) roll

Hors ligne

#6 15/01/2010 21:20:41

tabasseur
???
Inscription : 25/11/2009
Messages : 427

Re : Programme Bash : Supprimmer des balises HTML imbriquées.

Merci beaucoup pour ces conseils ! ;)
Effectivement, ça sera mieux.

Je vais plublier tes modifications, dès que je les aurais testées.

Sinon, pour le bout de code que je veux faire, personne ?


J'aime GNOME3, j'avoue. :)

Hors ligne

#7 15/01/2010 21:45:25

Pikachu_2014
Retraité
Lieu : Boulogne-Billancourt
Inscription : 16/06/2005
Messages : 11 334
Site Web

Re : Programme Bash : Supprimmer des balises HTML imbriquées.

Pour ce que tu veux faire, je te suggère un parcours ligne par ligne de ton fichier, avec un compteur pour compter les lignes : juste après

no_ligne=1
while read ligne; do   # chaque ligne du fichier $fichier est stockée dans la variable $ligne
   echo "$ligne"       # juste pour test, on affiche la ligne courante lue
   let no_ligne++      # on incrémente le compteur $no_ligne à chaque tour de boucle
done < "$fichier"

Pour tester si une ligne contient « <div id="pied"> » (on tient compte de l'indentation de la ligne ou bien d'éventuels espaces placés après le div) :

if [[ "$ligne" =~ "^\s*<div id=\"pied\">\s*$" ]]; then
   ...
fi

Pour supprimer la ligne numéro $machin de ton fichier $fichier :

sed "${machin}d" "$fichier"

Avec ces quelques éléments, tu devrais pouvoir finir ton script.


« …elle excitait si puissamment le désir, que je devins alors très incrédule sur sa vertu. »
À propos de Fœdora, dans la Peau de Chagrin (Balzac) roll

Hors ligne

#8 16/01/2010 05:43:16

bioinfornatics
Membre
Lieu : Paris
Inscription : 08/03/2007
Messages : 3 721
Site Web

Re : Programme Bash : Supprimmer des balises HTML imbriquées.

bon j'ai pas tout repris mais juste ajouter ma contribution

#!/usr/bin/env sh

function codeCouleur ()
{
    case $1 in
        "noir")
        colorCode=30
        ;;
        "rouge")
        colorCode=31
        ;;
        "vert")
        colorCode=32
        ;;
        "jaune")
        colorCode=33
        ;;
        "bleu")
        colorCode=34
        ;;
        "magenta")
        colorCode=35
        ;;
        "cyan")
        colorCode=36
        ;;
        "gris")
        colorCode=37
        ;;
        "defaut")
        colorCode=0
        ;;
        *)
        colorCode=""
        echo -e "\033[31mAttention!\033[0m choix invalide: $couleur et $1!\n"
        ;;
    esac
    echo $colorCode
}

function codeStyle ()
{
    case $1 in
        "defaut")
        styleCode=0
        ;;
        "gras")
        styleCode=1
        ;;
        "souligne")
        styleCode=4
        ;;
        "clignote")
        styleCode=5
        ;;
        "inverse")
        styleCode=7
        ;;
        "masque")
        styleCode=8
        ;;
        *)
        styleCode=""
        echo -e "\033[31mAttention!\033[0m choix invalide: $styleCode!\n"
        ;;
    esac
    echo $styleCode
}

function colorString ()
{
    case $# in
        3)
        local originalString=$1
        local couleur=$(codeCouleur $2)
        local style=$(codeStyle $3)
        local string="\033["$couleur";"$style"m"$originalString"\033[0m"
        ;;
        2)
        local originalString=$1
        local couleur=$(codeCouleur $2)
        local string="\033["$couleur"m"$originalString"\033[0m"
        ;;
        *)
        echo -e "\033[31mAttention!\033[0m nombre d'argument invalide!\n"
        echo -e "\033[31mUsage:\033[0m colorString <string> <couleur> [style]\n"
        local string=$originalString
        ;;
    esac

    echo $string
}


function usage ()
{

    message="Usage: $0 <option>"
    echo -e "$(colorString $message 31)\n"
}

function startMessage ()
{
    zenity --question --text "Ceci est un programme créé pour PCStreet. Ce programme est encore en construction, et doit être utilisé pour faire des tests, UNIQUEMENT! Etes-vous toujours certain de vouloir lancer ce porgramme sur votre PC?"
    echo $? 
}

##################### MAIN #####################
if [ $# -ne 0 ]
then
    usage
else
    choice=$(startMessage)
    if [ $choice -eq "1" ]
    then
        echo -e $(colorString '[STOP]' 'rouge')" le programme va quittez ..."
        exit 0
    else
        echo -e $(colorString '[OK]' 'vert')" Vous avez démarré le programme..."
        echo -e "Vous êtes ici : " $(colorString `pwd` 'bleu')
    fi
fi

je vais me coucher maintenant big_smile hammer

Dernière modification par bioinfornatics (16/01/2010 05:43:58)

Hors ligne

#9 16/01/2010 12:31:37

pingoomax
Retraité
Lieu : Paris
Inscription : 24/09/2004
Messages : 1 833
Site Web

Re : Programme Bash : Supprimmer des balises HTML imbriquées.

Il faut clairement que tu utilises awk pour faire ca.
Awk est fait pour ca : Parcourir du texte ligne par ligne et reconnaitre des expression à l'interrieur.


bouton-april-80x15.png Je suis membre de l'APRIL, et vous?
Vous aussi adhérez.

Hors ligne

#10 16/01/2010 23:40:45

tabasseur
???
Inscription : 25/11/2009
Messages : 427

Re : Programme Bash : Supprimmer des balises HTML imbriquées.

Je fais actuellement du awk :
http://nyal.developpez.com/tutoriel/gaw … age=struct

J'espère que c'est un bon tutoriel.

Merci.


J'aime GNOME3, j'avoue. :)

Hors ligne

#11 16/01/2010 23:51:34

Pikachu_2014
Retraité
Lieu : Boulogne-Billancourt
Inscription : 16/06/2005
Messages : 11 334
Site Web

Re : Programme Bash : Supprimmer des balises HTML imbriquées.

awk est un langage à lui tout seul, je croyais que tu voulais que du bash pur ^^
Ceci dit awk est un choix meilleur, en effet.


« …elle excitait si puissamment le désir, que je devins alors très incrédule sur sa vertu. »
À propos de Fœdora, dans la Peau de Chagrin (Balzac) roll

Hors ligne

#12 17/01/2010 03:07:34

bioinfornatics
Membre
Lieu : Paris
Inscription : 08/03/2007
Messages : 3 721
Site Web

Re : Programme Bash : Supprimmer des balises HTML imbriquées.

ça engage que moi mais tant utiliser awk alors part sur du perl

Hors ligne

#13 17/01/2010 16:41:04

tabasseur
???
Inscription : 25/11/2009
Messages : 427

Re : Programme Bash : Supprimmer des balises HTML imbriquées.

Moi, je pensais qu'on pouvait utiliser du awk dans du bash...

Sinon, pour ce qui est du perl, je pense que c'est un trop gros langage dont je n'ai pas le temps de m'y mettre.

Dernière modification par tabasseur (17/01/2010 16:41:54)


J'aime GNOME3, j'avoue. :)

Hors ligne

#14 20/01/2010 17:43:43

bioinfornatics
Membre
Lieu : Paris
Inscription : 08/03/2007
Messages : 3 721
Site Web

Re : Programme Bash : Supprimmer des balises HTML imbriquées.

je te reposte le bout de code avec coloration syntaxique pour que ce soit plus lisible (j'utilise pour ça mon script perso : ici )

#!/usr/bin/env sh

function codeCouleur ()
{
    case $1 in
        "noir")
        colorCode=30
        ;;
        "rouge")
        colorCode=31
        ;;
        "vert")
        colorCode=32
        ;;
        "jaune")
        colorCode=33
        ;;
        "bleu")
        colorCode=34
        ;;
        "magenta")
        colorCode=35
        ;;
        "cyan")
        colorCode=36
        ;;
        "gris")
        colorCode=37
        ;;
        "defaut")
        colorCode=0
        ;;
        *)
        colorCode=""
        echo -e "\033[31mAttention!\033[0m choix invalide: $couleur et $1!\n"
        ;;
    esac
    echo $colorCode
}

function codeStyle ()
{
    case $1 in
        "defaut")
        styleCode=0
        ;;
        "gras")
        styleCode=1
        ;;
        "souligne")
        styleCode=4
        ;;
        "clignote")
        styleCode=5
        ;;
        "inverse")
        styleCode=7
        ;;
        "masque")
        styleCode=8
        ;;
        *)
        styleCode=""
        echo -e "\033[31mAttention!\033[0m choix invalide: $styleCode!\n"
        ;;
    esac
    echo $styleCode
}

function colorString ()
{
    case $# in
        3)
        local originalString=$1
        local couleur=$(codeCouleur $2)
        local style=$(codeStyle $3)
        local string="\033["$couleur";"$style"m"$originalString"\033[0m"
        ;;
        2)
        local originalString=$1
        local couleur=$(codeCouleur $2)
        local string="\033["$couleur"m"$originalString"\033[0m"
        ;;
        *)
        echo -e "\033[31mAttention!\033[0m nombre d'argument invalide!\n"
        echo -e "\033[31mUsage:\033[0m colorString <string> <couleur> [style]\n"
        local string=$originalString
        ;;
    esac

    echo $string
}


function usage ()
{

    message="Usage: $0 <option>"
    echo -e "$(colorString $message 31)\n"
}

function startMessage ()
{
    zenity --question --text "Ceci est un programme créé pour PCStreet. Ce programme est encore en construction, et doit être utilisé pour faire des tests, UNIQUEMENT! Etes-vous toujours certain de vouloir lancer ce porgramme sur votre PC?"
    echo $?
}

##################### MAIN #####################
if [ $# -ne 0 ]
then
    usage
else
    choice=$(startMessage)
    if [ $choice -eq "1" ]
    then
        echo -e $(colorString '[STOP]' 'rouge')" le programme va quittez ..."
        exit 0
    else
        echo -e $(colorString '[OK]' 'vert')" Vous avez démarré le programme..."
        echo -e "Vous êtes ici : " $(colorString `pwd` 'bleu')
    fi
fi

Hors ligne

#15 20/01/2010 18:08:33

proxy
Membre
Lieu : Localhost
Inscription : 15/08/2007
Messages : 8 806

Re : Programme Bash : Supprimmer des balises HTML imbriquées.

Quand tu es des case/esac de 3 kms, pense aux tableaux :

function codeCouleur () {
  couleurs=("noir" "rouge" "vert" "jaune" .........)
  codes=("30" "31" "32" "33" .........)
  stylecode="invalide"
  for i in ${couleurs[@]}; do
    if [[ $i == ${1} ]] ; then
       stylecode="${couleurs[$i]}"
       break
   fi
done
echo "${stylecode}
}

Dernière modification par proxy (20/01/2010 18:09:04)


Il date de quand votre dernier backup ?

Hors ligne

#16 20/01/2010 18:17:18

bioinfornatics
Membre
Lieu : Paris
Inscription : 08/03/2007
Messages : 3 721
Site Web

Re : Programme Bash : Supprimmer des balises HTML imbriquées.

pas mal wink

Hors ligne

Pied de page des forums