N-PN White-Hat Project
comment afficher une portion de fichier - Version imprimable

+- N-PN White-Hat Project (https://dev.n-pn.fr/forum)
+-- Forum : Programmation (https://dev.n-pn.fr/forum/forumdisplay.php?fid=72)
+--- Forum : Langages interprétés (https://dev.n-pn.fr/forum/forumdisplay.php?fid=27)
+--- Sujet : comment afficher une portion de fichier (/showthread.php?tid=3630)



comment afficher une portion de fichier - gruik - 09-05-2014

je sais pas vous, mais moi j'ai l'habitude de commenter assez généreusement les bouts de code que j'écris, particulièrement quand il s'agit d'une fonction ou d'un programme qui peut prendre plusieurs paramètres, à tel point qu'avec un paramètre --help je pourrais presque me permettre d'afficher purement et simplement le commentaire :

Code BASH :
# commentaire n°1, osef
# blabla
function n1() {
    blaaaa
}

# toto : fonction qui fait pleins de trucs
#    --riri     permet d'invoquer riri
#    --fifi     faire une partie de belotte
#    --loulou   mettre oncle donald a la flotte
function toto() {
    blablabla
     bla.
}

# commentaire n°3, osef aussi
# blablabla
# prout
function n3() {
    blablacoinbla
    gruikcoinblabla
}


alors voila, le but est d'afficher uniquement le 2e commentaire, comment je pourrais faire ?


RE: comment afficher une portion de fichier - fr0g - 09-05-2014

Bash :

Code BASH :

#test
#test 2
sed -n 2p $0
 


Code :
██ [ ~ ] [ 14:43:35 ]
██ sh test.sh
#test 2

python:
Code PYTHON :

#test
#test 2
import sys
print open(sys.argv[0], "r").read().split("\n")[1]
#welcome in crappy land
 


Code :
██ [ ~ ] [ 14:42:55 ]
██ python test.py
#test 2



RE: comment afficher une portion de fichier - balis - 09-05-2014

Paramètre un fichier en bash avec les commentaires dedans , genre $1 pour le commentaire n 1 etc ?


RE: comment afficher une portion de fichier - gruik - 09-05-2014




RE: comment afficher une portion de fichier - fr0g - 09-05-2014

Après discussion sur irc j'ai mieux compris le truc recherché Smile

Un peu long ma version en Py, je pense qu'il y a largement moyen de faire plus court
Code PYTHON :

import sys

# toto : fonction qui fait pleins de trucs
#    --riri     permet d'invoquer riri
#    --fifi     faire une partie de belotte
#    --loulou   mettre oncle donald a la flotte
def toto():
    print 1337

# get_comment:
# fonction qui recupere les commentaires
def get_comment(f):
    r = []
    c = open(sys.argv[0], "r").read().split("\n")
    i = 0
    j = 0
    while (i < len( c )):
        if (c[i].replace(" ", "").replace("\t", ""))[:+(3 + len(f))] == "def"+f:            
            j =  i - 1
            while (j > 0):
                if (len(c[j]) == 0 or (c[j].replace(" ","").replace("\t", ""))[0] != "#"): break
                j -= 1
            break
        i += 1
    for x in range(j, i):
        print c[x]

#exemple :
get_comment("get_comment")
get_comment("toto")

 


Execution :
Code :
██ [ ~ ] [ 15:42:02 ]
██ python test.py

# get_comment:
# fonction qui recupere les commentaires

# toto : fonction qui fait pleins de trucs
#    --riri     permet d'invoquer riri
#    --fifi     faire une partie de belotte
#    --loulou   mettre oncle donald a la flotte



RE: comment afficher une portion de fichier - gruik - 09-05-2014

yep sur le principe c'est valide, y'a moyen de faire plus court néanmoins Wink


RE: comment afficher une portion de fichier - Booster2ooo - 09-05-2014

En pseudo code vite fais pcq j'suis overbooké
Code :
function getComment(fName) {
    var me = file_open(process.arg[0], r).readToEnd();
    var regEx = new RegEx("# "+fName+"\s?:(.*)function "+fName+"\(\)\s?{");
    var match = regEx.matches(me);
    var help = "# "+fName+" :" + match + "function "+ fName +"() {";
    return help;
}



RE: comment afficher une portion de fichier - gruik - 09-05-2014

en fait tu match sur le fait qu'on a :
Code :
# fName :
(...)
function fName() {
le format de la premiere ligne du bloc de commentaire n'est pas garanti, mais pourquoi pas Smile ça marche aussi.


RE: comment afficher une portion de fichier - Junky - 09-05-2014

Pris dans ma réserve de commandes:

Code BASH :


sed -e '/./{H;$!d;}' -e 'x;/toto/!d;' pouet.py | grep "#"

 


Sortie:
Code BASH :

(509) silentd@G3nt00:~$ sed -e '/./{H;$!d;}' -e 'x;/toto/!d;' pouet.py | grep "#"
# toto : fonction qui fait pleins de trucs
#    --riri     permet d'invoquer riri
#    --fifi     faire une partie de belotte
#    --loulou   mettre oncle donald a la flotte
(510) silentd@G3nt00:~$
 


Seul "inconvéniant" il faut que le bloque de commentaire soit déparé par des espaces


RE: comment afficher une portion de fichier - Booster2ooo - 09-05-2014

(09-05-2014, 16h23)gruik a écrit : en fait tu match sur le fait qu'on a :
Code :
# fName :
(...)
function fName() {
le format de la premiere ligne du bloc de commentaire n'est pas garanti, mais pourquoi pas Smile ça marche aussi.

"}\s*#(.*)function "+fName+"\(\)\s?("
Ca devrait le faire aussi non?

Apres, je ne vois plus d'autre solution que de lire le fichier, le splitter en une liste de lignes et la lire à l'envers, dès qu'on tombe sur function toto() {, on output les lignes qui commencent par #, et quand il y en a plus, on exit?


RE: comment afficher une portion de fichier - gruik - 09-05-2014

(09-05-2014, 16h53)Booster2ooo a écrit : "}\s*#(.*)function "+fName+"\(\)\s?("
Ca devrait le faire aussi non?
humm... l'accolade fermante } en début je suis pas certain de voir où ça mène en fait...

Citation :Apres, je ne vois plus d'autre solution que de lire le fichier, le splitter en une liste de lignes et la lire à l'envers, dès qu'on tombe sur function toto() {, on output les lignes qui commencent par #, et quand il y en a plus, on exit?

ce dont on est sûr c'est qu'il y a une ligne vide (\n\n) juste avant le bloc de commentaire (c'est plus lisible quoi), que chaque ligne du bloc de commentaires commence par '#' et que l'on doit s'arreter à la ligne (unique) qui commence par "function toto"

une methode consiste à dire :
- si la ligne commence par "function toto" on affiche le tableau t
- si la ligne commence par '#' on la rajoute au tableau t
- sinon on met le tableau t à zéro

en perl :
Code PERL :
perl -ne 'print @t if/^function toto/;(/^#/)?push @t,$_:{@t=()}' programme.sh

note que la 2e partie est un opérateur ternaire

ça marche aussi avec du awk, c'est juste un chouillat plus long


RE: comment afficher une portion de fichier - gruik - 09-05-2014

et la version à base de regex, en une ligne de python (cc fr0g ;p) :
Code PYTHON :
python -c 'import re; print re.findall("\n\n(#(?:.(?!\n{2}))+)function toto", open("script.sh").read(), re.MULTILINE | re.DOTALL)[0]'



RE: comment afficher une portion de fichier - fr0g - 09-05-2014

(09-05-2014, 17h39)gruik a écrit : et la version à base de regex, en une ligne de python (cc fr0g ;p) :
Code PYTHON :
python -c 'import re; print re.findall("\n\n(#(?:.(?!\n{2}))+)function toto", open("script.sh").read(), re.MULTILINE | re.DOTALL)[0]'

Yep, en regex c'est tout de suite plus court ^^