Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
Test de l'ISO d'Ubuntu francophone : nous avons besoin de testeurs pour la version francophone d'Ubuntu 14.04. Liens et informations ici.

Attention, une faille de sécurité dans bash a récemment été rapportée, il est recommandé de mettre à jour son système (plus de détails) *** mise à jour 12/10/2014 ***

#1 Le 15/12/2009, à 11: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 smile

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, à 12:52)

En ligne

#2 Le 15/12/2009, à 11: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 ?


Java stuff ::
tPortal.. ma petite implémentation de la JSR168
jlibParam.. pooling, paramétrage etc...

Hors ligne

#3 Le 15/12/2009, à 12: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, à 12:24)

En ligne

#4 Le 15/12/2009, à 12: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.

Java stuff ::
tPortal.. ma petite implémentation de la JSR168
jlibParam.. pooling, paramétrage etc...

Hors ligne

#5 Le 15/12/2009, à 12: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, à 12:48)

En ligne

#6 Le 15/12/2009, à 12: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, à 12: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, à 12:51)

En ligne

#8 Le 15/12/2009, à 13:01

Totor

Re : (résolu) Texte entre 2 occurrences

Hizoka a écrit :

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, à 23: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 16/12/2009, à 00: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 16/12/2009, à 00:10)

En ligne

#11 Le 16/12/2009, à 01:37

Totor

Re : (résolu) Texte entre 2 occurrences

Hizoka a écrit :
awk: line 2: function gensub never defined

utilise gawk


-- Lucid Lynx --

Hors ligne

#12 Le 16/12/2009, à 01:39

Hizoka

Re : (résolu) Texte entre 2 occurrences

arg encore un paquet... tant pis ma solution me convient smile

sinon je veux bien ton aide pour ça : http://forum.ubuntu-fr.org/viewtopic.php?id=366125

En ligne

#13 Le 16/12/2009, à 09:28

Totor

Re : (résolu) Texte entre 2 occurrences

Hizoka a écrit :

arg encore un paquet...

Étrange, normalement il est par défaut installé hmm

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, à 15:55)


-- Lucid Lynx --

Hors ligne

#14 Le 16/12/2009, à 19: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.

En ligne

#15 Le 16/12/2009, à 19: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 hmm

que te donne :

ls -l /etc/alternatives/*awk


-- Lucid Lynx --

Hors ligne

#16 Le 16/12/2009, à 20: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

En ligne

#17 Le 16/12/2009, à 22: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, à 10: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 smile.

En ligne

#19 Le 17/12/2009, à 12: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

Haut de page ↑