#1 Le 15/12/2009, à 10:35
- Hizoka
(résolu) Texte entre 2 occurrences
Bonjour,
Soit le texte suivant (nombre de ligne entre les # jamais fixe) :
Accueil | Top 30 | En Images! | Derniers facts | Moderez! | Proposer | FAQ
| Contact |
_____________________ [ OK ]
Type de parcours : Top Points - Flop points - Top Moyenne - Flop Moyenne -
Aleatoire - Derniers ajouts
#2043 417 / 8.26 (+++) (++) (+) (Berk)
Quand un avion s'ecrase ,c'est parce que Chuck Norris l'a lance trop fort.
#61038 3086 / 7.93 (+++) (++) (+) (Berk)
Quand Chuck Norris est sur l'ordinateur, il n'affiche jamais "Ce programme
ne repond pas". On ne snobe pas Chuck Norris.
#40864 1366 / 7.93 (+++) (++) (+) (Berk)
Contrairement `a Dieu, on ne tutoie pas Chuck Norris.
J'arrive pas à afficher le texte se trouvant entre les 2 premiers #.
avec la commande
sed -n '/#/,/#/p'
il m'affiche tout entre le 1er et dernier #
j'ai beau chercher, je ne trouve pas de commande qui me convienne...
Si vous avez une idée, merci de l'indiquer
Sinon il faudrait réussir à lui dire ne pas sauter de ligne entre les lignes contenant un #
Mon but est d'obtenir le texte entre les lignes avec un # en une seule ligne.
Exemple :
Quand Chuck Norris est sur l'ordinateur, il n'affiche jamais "Ce programme ne repond pas". On ne snobe pas Chuck Norris.
Dernière modification par Hizoka (Le 15/12/2009, à 11:52)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#2 Le 15/12/2009, à 10:47
- seb0uil
Re : (résolu) Texte entre 2 occurrences
Salut,
entre les 2 premiers # c'est
2043 417 / 8.26 (+++) (++) (+) (Berk)
Quand un avion s'ecrase ,c'est parce que Chuck Norris l'a lance trop fort.
c'est ca que tu veux, ou juste les lignes sans # ?
Dans ce cas un grep -v "^#" pourrait suffire non ?
Hors ligne
#3 Le 15/12/2009, à 11:03
- Hizoka
Re : (résolu) Texte entre 2 occurrences
je veux : "Quand un avion s'ecrase ,c'est parce que Chuck Norris l'a lance trop fort." dans l'exemple.
c'est à dire le texte entre la 1ere ligne contenant un # et la 2éme.
mais si tu arrives à m'obtenir comme dans ton exemple :
2043 417 / 8.26 (+++) (++) (+) (Berk)
Quand un avion s'ecrase ,c'est parce que Chuck Norris l'a lance trop fort.
ca m'aiderait surement...
EDIT : J'ai trouvé une bonne commande là :
sed -n '/#/,/#/{//d;p}'
Ca m'affiche tous les textes entre les lignes contenant # sans ses lignes.
Dernière modification par Hizoka (Le 15/12/2009, à 11:24)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#4 Le 15/12/2009, à 11:24
- seb0uil
Re : (résolu) Texte entre 2 occurrences
Si le nombre de ligne de l'entête est fixe , tu peux essayer avec
$ more chuck.txt
Accueil | Top 30 | En Images! | Derniers facts | Moderez! | Proposer | FAQ
| Contact |
_____________________ [ OK ]
Type de parcours : Top Points - Flop points - Top Moyenne - Flop Moyenne -
Aleatoire - Derniers ajouts
#2043 417 / 8.26 (+++) (++) (+) (Berk)
Quand un avion s'ecrase ,c'est parce que Chuck Norris l'a lance trop fort.
#61038 3086 / 7.93 (+++) (++) (+) (Berk)
Quand Chuck Norris est sur l'ordinateur, il n'affiche jamais "Ce programme ne re
pond pas". On ne snobe pas Chuck Norris.
#40864 1366 / 7.93 (+++) (++) (+) (Berk)
#
#
Contrairement `a Dieu, on ne tutoie pas Chuck Norris.
$ grep -v "^#" chuck.txt |tail +5
Aleatoire - Derniers ajouts
Quand un avion s'ecrase ,c'est parce que Chuck Norris l'a lance trop fort.
Quand Chuck Norris est sur l'ordinateur, il n'affiche jamais "Ce programme ne re
pond pas". On ne snobe pas Chuck Norris.
Contrairement `a Dieu, on ne tutoie pas Chuck Norris.
Hors ligne
#5 Le 15/12/2009, à 11:27
- Hizoka
Re : (résolu) Texte entre 2 occurrences
ouais mais ça répond pas du tout à ce que je veux :)
par exemple :
#61038 3086 / 7.93 (+++) (++) (+) (Berk)
Quand Chuck Norris est sur l'ordinateur, il n'affiche jamais "Ce programme ne re
pond pas". On ne snobe pas Chuck Norris.
#40864 1366 / 7.93 (+++) (++) (+) (Berk)
et je veux :
Quand Chuck Norris est sur l'ordinateur, il n'affiche jamais "Ce programme ne re pond pas". On ne snobe pas Chuck Norris.
là j'arrive à récupérer le texte entre les # donc :
Quand Chuck Norris est sur l'ordinateur, il n'affiche jamais "Ce programme ne re
pond pas". On ne snobe pas Chuck Norris.
me reste à lui dire de supprimer les retour chariots sur les lignes ne se terminant pas par un point.
Pour le moment j'en suis là :
links -dump 'http://www.chucknorrisfacts.fr/index.php?p=parcourir&tri=aleatoire' | sed -n '/#/,/#/{//d;p}' | sed 's/^ *//g ; s/`//g' | sed -n '1,/\.$/p'
qui me donne quelque chose comme :
Chuck Norris peut demontrer les axiomes.
Dans n'importe quel episode de Final Fantasy, un personnage baptise "Chuck
Norris" aura d'emblee toutes les caracteristiques a 255 et toutes les
invocations.
Il faut que j'arrive à trouver une solution pour qu'il s'arrete au 1er point meme si il se trouve sur la 1ere ligne ou comment lui dire de ne pas sauter une ligne quand la phrase est en 2 lignes.
Dernière modification par Hizoka (Le 15/12/2009, à 11:48)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#6 Le 15/12/2009, à 11:47
- Totor
Re : (résolu) Texte entre 2 occurrences
Bonjour,
pour récupérer la 2nde occurence :
links -dump 'http://www.chucknorrisfacts.fr/index.php?p=parcourir&tri=aleatoire'|awk -v OCC=2 'BEGIN{ RS="#" } NR==OCC'
Tu auras compris qu'il suffit de changer la valeur de OCC pour avoir la Nième...
-- Lucid Lynx --
Hors ligne
#7 Le 15/12/2009, à 11:50
- Hizoka
Re : (résolu) Texte entre 2 occurrences
bouhouhou.... je passe 3 plombs (vraiment 3 heures en plus...) là dessus et pis Totor il arrive et en 10sec, pouf c'est réglé !!
hizoka@pc-hizo:~$ links -dump 'http://www.chucknorrisfacts.fr/index.php?p=parcourir&tri=aleatoire'|awk -v OCC=2 'BEGIN{ RS="#" } NR==OCC' | sed '1d ; s/^ *//g ; /^$/d'
Chuck Norris s'est entraine avec Maitre Miaggi de karatekid
Merci beaucoup à toi !!!
il faut vraiment que je m'y mette à awk mais c'est franchement pas super simple...
t'as un bon tuto pour awk ?
Dernière modification par Hizoka (Le 15/12/2009, à 11:51)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#8 Le 15/12/2009, à 12:01
- Totor
Re : (résolu) Texte entre 2 occurrences
t'as un bon tuto pour awk ?
J'ai appris awk avec ce guide (dédié au ksh) en page 94. Mais cela fait 2 ans que je n'y ai pas mis le nez car depuis que j'ai compris la philosophie, je n'utilise que le man et parfois ce site
-- Lucid Lynx --
Hors ligne
#9 Le 15/12/2009, à 22:46
- Totor
Re : (résolu) Texte entre 2 occurrences
Bonsoir,
Je n'avais pas fait attention que tu voulais supprimer la 1ère ligne d'une occurence ainsi que les blancs en début de ligne. Par ailleurs, le simple caractère "#" comme séparateur ne suffit pas car il peut être présent dans le texte. Alors voilà une solution full awk :
links -dump 'http://www.chucknorrisfacts.fr/index.php?p=parcourir&tri=aleatoire'|awk -v OCC=2 'BEGIN {RS="\n[[:blank:]]*#[^\n]+\n"} NR==OCC { texte=gensub(/(^|\n)[[:blank:]]+/,"\\1","g"); print texte}'
-- Lucid Lynx --
Hors ligne
#10 Le 15/12/2009, à 23:09
- Hizoka
Re : (résolu) Texte entre 2 occurrences
awk: line 2: function gensub never defined
mais tout ce que je veux c'est virer les blancs devant les textes et afficher le texte entre 2 # (que ce soit la 2éme ou autre on s'en fiche), du coup
- je supprime la 1ere ligne : 78171 2486 / 8.33 (+++) (++) (+) (Berk)
- je supprime les espaces de début
- je supprime la ligne vide se trouvant juste avant la ligne ayant #
Je n'ai trouvé aucun # dans les textes, donc pas de problème.
Dernière modification par Hizoka (Le 15/12/2009, à 23:10)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#11 Le 16/12/2009, à 00:37
- Totor
Re : (résolu) Texte entre 2 occurrences
awk: line 2: function gensub never defined
utilise gawk
-- Lucid Lynx --
Hors ligne
#12 Le 16/12/2009, à 00:39
- Hizoka
Re : (résolu) Texte entre 2 occurrences
arg encore un paquet... tant pis ma solution me convient
sinon je veux bien ton aide pour ça : http://forum.ubuntu-fr.org/viewtopic.php?id=366125
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#13 Le 16/12/2009, à 08:28
- Totor
Re : (résolu) Texte entre 2 occurrences
arg encore un paquet...
Étrange, normalement il est par défaut installé
EDIT : Utilise RS="\n[[:blank:]]*#[^\n]+\n" plutôt que RS="#" pour supprimer la 1ere ligne et remplace texte=gensub(/(^|\n)[[:blank:]]+/,"\\1","g"); print texte par
gsub(/^[[:blank:]]+/, ""); gsub(/\n[[:blank:]]+/,"\n"); print pour supprimer les blancs en début de ligne. Cela t'évitera d'utiliser sed
Dernière modification par Totor (Le 16/12/2009, à 14:55)
-- Lucid Lynx --
Hors ligne
#14 Le 16/12/2009, à 18:44
- Hizoka
Re : (résolu) Texte entre 2 occurrences
links -dump 'http://www.chucknorrisfacts.fr/index.php?p=parcourir&tri=aleatoire'|awk -v OCC=2 'BEGIN {RS="\n[[:blank:]]*#[^\n]+\n"} NR==OCC { gsub(/^[[:blank:]]+/, ""); gsub(/\n[[:blank:]]+/,"\n"); print}'
Si j'ai bien compris ça donne ça, mais je n'ai aucun retour.
un :
links -dump 'http://www.chucknorrisfacts.fr/index.php?p=parcourir&tri=aleatoire'|awk -v OCC=2 'BEGIN{ RS="\n[[:blank:]]*#[^\n]+\n"} NR==OCC'
ne me renvoi deja rien.
donc ça doit venir de : RS="\n[[:blank:]]*#[^\n]+\n"
Je suis sous kde donc c'est peut-être pour ça que je n'ai pas gawk.
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#15 Le 16/12/2009, à 18:59
- Totor
Re : (résolu) Texte entre 2 occurrences
Oui, c'est certainement awk (que je n'ai pas sur mon poste).
Mais c'est vraiment étrange que tu n'aies pas gawk d'installer par défaut
que te donne :
ls -l /etc/alternatives/*awk
-- Lucid Lynx --
Hors ligne
#16 Le 16/12/2009, à 19:07
- Hizoka
Re : (résolu) Texte entre 2 occurrences
lrwxrwxrwx 1 root root 13 2009-12-13 09:23 /etc/alternatives/awk -> /usr/bin/mawk
lrwxrwxrwx 1 root root 13 2009-12-13 09:23 /etc/alternatives/nawk -> /usr/bin/mawk
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#17 Le 16/12/2009, à 21:38
- Totor
Re : (résolu) Texte entre 2 occurrences
Alors voilà :
links -dump 'http://www.chucknorrisfacts.fr/index.php?p=parcourir&tri=aleatoire'|awk -v OCC=2 'BEGIN {RS="\n *#[^\n]+\n"} NR==OCC { gsub(/^ +/, ""); gsub(/\n +/,"\n"); print}'
mawk ne reconnait pas [[:blank:]], je l'ai donc remplacé par un simple espace et c'est ok.
-- Lucid Lynx --
Hors ligne
#18 Le 17/12/2009, à 09:08
- Hizoka
Re : (résolu) Texte entre 2 occurrences
peux tu me donner la commande pour effacer les ` qui se trouvent dans les textes des fois.
ca me permettrait de voir un peu comment on peut utiliser awk pour un simple remplacement de caractère
sinon, merci ça marche .
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#19 Le 17/12/2009, à 11:12
- Totor
Re : (résolu) Texte entre 2 occurrences
Pour supprimer un caractère, utilise gsub :
gsub(/`/, "", <nomvariable>)
La modification s'effectue directement dans la variable.
1er paramètre : permet de préciser l'ERE (donc ici /`/ = uniquement le caractère `
2nd paramètre : chaine de remplacement (ici = "" = vide)
3eme paramètre : variable dans laquelle la recherche doit être effectuée. Ce paramètre est optionnel et s'il est homis, ce sera l'enregistrement courant qui sera utilisé.
(Par défaut, un enregistrement est une ligne du fichier. tu peux changer le délimiteur d'enregistrement via la variable RS : cf. script)
-- Lucid Lynx --
Hors ligne