- Fedora-Fr
- À propos de Fedora-Fr
- Historique
- Statistiques
- Télécharger
- Obtenir Fedora
- Toutes les méthodes de téléchargement
- Support
- Aide sur IRC
- Forums
- Documentation
- Sous-projets
- Plateforme de blog
Dernière news : Fedora 34 n'est plus maintenu
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
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
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
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
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 :
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
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
for fichier in "$repertoire"/spip*.html
Ce sont les premières remarques qui me viennent après survol rapide. D'autres commentaires suivront
« …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)
Hors ligne
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
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)
Hors ligne
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
Dernière modification par bioinfornatics (16/01/2010 05:43:58)
Hors ligne
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.
Je suis membre de l'APRIL, et vous?
Vous aussi adhérez.
Hors ligne
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
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)
Hors ligne
ça engage que moi mais tant utiliser awk alors part sur du perl
Hors ligne
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
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
;;
esacecho $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
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
pas mal
Hors ligne