szasztok! hogyan tudnám én kigreppelni egy projekt fájljaiból azokat a függvényneveket, amelyek törzsében egy adott sztring szerepel? konkrétan egy függvényhívást keresek. a project c kód.
- 2161 megtekintés
Hozzászólások
A grep-el megadott stringet tartalmazó sorokat lehet csak "kiszedni" egy file-ból. (szerintem, de érhet meglepetés :))
- A hozzászóláshoz be kell jelentkezni
igazad van, bár engem is érhet meglepetés, még örülnék is neki.
awk nélkül sztem nincs esély.
valahogy awk { vagy } elválasztó karakterrel.
végül is az a neheze, hogy hogy definiálod azt, hogy mi az hogy egy függvény törzse
http://www.cs.man.ac.uk/~pjj/bnf/c_syntax.bnf
:/
- A hozzászóláshoz be kell jelentkezni
kiirja a fileneveket amiben az keresendo szo megtalalhato. ha nem jo tovabbfejleszted :)
#!/bin/bash
SEARCH=$1
DIR=$2
if [ -z $DIR ]; then DIR="."; fi
if [ -z $SEARCH ]; then SEARCH="keres"; fi
echo "Searching for '"$SEARCH"' ..."
export SEARCH
/usr/bin/find $DIR -type f \
| /usr/bin/awk '{ print "if [ -n \"`/bin/cat \\\""$0"\\\" | /bin/grep -i \\\"$SEARCH\\\"`\" ]; then echo \"=== "$0" ===\"; fi" }' \
| /bin/sh
- A hozzászóláshoz be kell jelentkezni
szép-szép, de ennyi erővel akkor már inkább így és akkor még a sort is tudni fogod nem csak a file nevet:
grep -n keresenedőfvneve *.kiterjesztés
- A hozzászóláshoz be kell jelentkezni
En azert az awk parancsban levo print-hez tartozo if-kezdetu sztringet valoszinuleg generaltatnam perl-lel, mert igy van ne'mi esely ra, hogy megertheto a dolog. Es javasolnam a tr es a join hasznalatat is, mert ugy meg atlathatatlanabb lenne a dolog.
- A hozzászóláshoz be kell jelentkezni
Csak grep johet szoba?
- A hozzászóláshoz be kell jelentkezni
nem, lehet awk-val is, csak ugye előbb írjál egy compilert.
hányféleképpen lehet deklarálni egy függvényt? :)
[típus] [operátor][név]([paraméterlista])
típus lehet akár saját is, így még a common típusokra sem tudsz szűrni, operátorból nem tudom mi lehet, mert nem vagyok cguru.
és akkor még szerencse, ha csak ilyen egyszerű, és akkor ezt még különböztesd meg egy standard függvényhívástól... hehe
- A hozzászóláshoz be kell jelentkezni
parser!=compiler
- A hozzászóláshoz be kell jelentkezni
visszatérés függvény(argok)
{
...
amit keresek
...
}
ami kisértetiesen hasonlít erre:
while(feltétel)
{
...
}
nem túl hasznos, hogyha azt írja ki, hogy while....
- A hozzászóláshoz be kell jelentkezni
Hát akkor legfeljebb a végén kiszűri azokat a sorokat, amelyekben "while(" meg "for(" van.
Amúgy meg ha van egy listája, amiben pár elem téves, akkor is előbbre van, mint ha kézzel-lábbal nézegeti, hogy mi hol van.
---
Science for fun...
- A hozzászóláshoz be kell jelentkezni
dehogy, minden jó ami bash
az is megtenné igazából, hogyha kdevelopba vágtok valami fasza fícsört, ami elkerülte a figyelmem
- A hozzászóláshoz be kell jelentkezni
nem tudom ilyesmit keresel-e, de en ezt szoktam raengedni a cuccaimra, ha keresek egy olyan fajlt, amiben egy bizonyos string van:
find /hol/keressen | xargs grep "mit keressen"
ennel egyszerubb/gyorsabb nincs :)
--
The Internet has evolved from smart people in front of dumb terminals to dumb people in front of smart terminals.
- A hozzászóláshoz be kell jelentkezni
abban sem vagyok biztos, hogy véges sok féle képpen lehet egy adott sort kiszedni egy fileból.
ki szeretném keresni azokat a fügvényneveket, amik definíciójában, azaz nem deklarációjában, vagy törzsében, vagy a { és } közötti részében található egy sztring
ha a file nevet meg a sort is kiírná tótágast állnék örömömben
- A hozzászóláshoz be kell jelentkezni
Egy egyszeru (nem elegseges) megoldas:
grep -nr "szoveg minta" `find . -type f`
Talan reszben jo. Kiirja a talalatot kapott fajl nevet, es hogy mely sor(ok)ban volt talalat, es termeszetesen magat a sort is. A fajlokat az aktualis konyvtartol rekurzivan vizsgalja. Ha tul sok van belolle, akkor problema lehet.
A fajl nev es a sor alapjan visszakeresheto a kivant dolog (greppel ennyi oldhato meg).
- A hozzászóláshoz be kell jelentkezni
xargs kell neki, attol gyorsabb
a xargs jo.
szeressetek. :)
--
The Internet has evolved from smart people in front of dumb terminals to dumb people in front of smart terminals.
- A hozzászóláshoz be kell jelentkezni
Miert gyorsabb? Sztem ugyanugy osszegyujti es egy helyre pakolja oket, mint az feljebb is latszik, az mar mas kerdes h okosabb, meg kevesbe akad ki :o)
- A hozzászóláshoz be kell jelentkezni
No, kicsit csúnya hekk lesz talán, mert grep nem tud függvénynevet keresni, de a diff igen:
mondjuk alma a string, amit keresel:
for i in *.c
sed s/alma/ALMA/ $i > $i.keress
diff --show-c-function $i $i.keress
rm $i.keress
done
Ilyesmi jutott először eszembe.
G
- A hozzászóláshoz be kell jelentkezni
hmmmmm
ez királynak tünik, kicsit kell rajta kalapálni, de köszi szépen
- A hozzászóláshoz be kell jelentkezni
Tok hasonlo problema :) Most vettem eszre, hogy nemelyik apt-build foditott csomag nem jo.
Namost, a "find . -type f | xargs -L 1 dpkg-deb -I | grep EOF " szepen kiirja, hogy hoppa, az hibas, de sajna ebbol nem tudom meg, melyik a csomag neve...
Na, asszem az lesz, hogy fileba irja grep nelkul , utana mc/F7 es vegigkeresem a filet kezzel...
A nyavalya..."grep -H" jo lenne, de a dpkg-deb, ugy latszik, nem adja at a file nevet...
Logikus, hogy nem adja meg, a stderr kimenete az EOF...Na, alakul ez :)
- A hozzászóláshoz be kell jelentkezni
Az én megoldásom:
grep -rin 'eztafuggvenytkeresem' /ahol/van/a/projekt/konyvtara
---------
"Ha igazat mondasz azt végig unják, ha feldíszíted azt jól meg dugják"
szerény blogom -- új címen!
- A hozzászóláshoz be kell jelentkezni
Van olyan grep is hogy sgrep. Kicsit pilótavizsgás...
[quoute]sgrep (structured grep) is a tool for searching text files and filtering text streams using structural criteria.
The data model of sgrep is based on regions, which are non-empty sub‐strings of text. Regions are typically occurrences of constant strings or meaningful text elements, which are recognizable through some delimiting strings. Regions can be arbitrarily long, arbitrarily overlapping, and arbitrarily nested.
- A hozzászóláshoz be kell jelentkezni
Ezt gondolom még ki kell egészíteni valamivel, ami kigyűjti az összes függvény implementációt, hogy melyik fájlban mettől meddig tart sorokban.
Egyszer kellett nekem egy olyan valami ami felsorloja a függvény implemetácót: neten találtam is egy perl scripet: function_grep.pl.
Olyan is kellett nekem ami kiírja egy adott függvény implemetációját, írtam egy ki C progit :)
gyakorlatilag csak végig követi a {} párokat és a stdin-ről olvassa a sorokat addig amíg az utolsó }-t is be nem olvassa, tehát a megfelelő sortól kezdve kell a fájlt át csövezni neki:
/* fun_body.c
* stdin-t masolja stdout-ra az elso fv torzs vegeig
*/
#include <stdio.h>
#define TRUE 1
#define FALSE 0
typedef int boolean;
enum States { NORMAL, PER, CppCOMMENT, CCOMMENT, ASTERISK };
int b_count;
boolean is_exit = FALSE;
void check_body(char c)
{
if(c=='{')
b_count++;
else if(c=='}')
if((--b_count)==0)
is_exit=TRUE;
}
int main()
{
int state = NORMAL;
int i;
char c;
b_count = 0;
while(((i = getchar()) != EOF) && (!is_exit))
{
c=(char)i;
switch(state)
{
case NORMAL:
if(c=='/')
state=PER;
else
{
//putchar(c);
check_body(c);
}
break;
case PER:
if(c=='*')
state=CCOMMENT;
else if(c=='/')
state=CppCOMMENT;
else
{
state=NORMAL;
//putchar('/');
//putchar(c);
check_body(c);
}
break;
case CppCOMMENT:
if(c=='\n')
{
state=NORMAL;
//putchar('\n');
}
break;
case CCOMMENT:
if(c=='*')
state=ASTERISK;
break;
case ASTERISK:
if(c=='/')
state=NORMAL;
else if(c!='*')
state=CCOMMENT;
break;
default:
fprintf(stderr,"Unhandled switch case");
return -1;
break;
}
putchar(c);
}
putchar('\n');
return 0;
}
Aztán találtam még egy bash scriptet is ami ezt a C progit hívja meg de a fájl nevét és a sor számát kell neki átadni ahol a függvény kezdődik:
#!/bin/bash
# Return values
# 0: Success
# 1: argumentum error
DEBUG= #set for debugging
FUN_BODY_FINDER="fun_body" # sajat fv torzset kiiro program
PROGNAME=`basename $0`
usage()
{
cat << USAGE_END
Function implementation shower
Usage:
$PROGNAME <source_file> <line_num>
where line_num is the line number where the function implementation begins
USAGE_END
}
if [ $# -ne 2 ] ; then
echo "need 2 arguments instead of $#" 1>&2
usage
exit 1
fi
# ARG HANDLING
FILENAME="$1"
LINENUM="$2"
if [ $DEBUG ] ; then
echo "FILENAME: |$FILENAME| ; LINENUM: |$LINENUM|"
fi
if [ ! -r "$FILENAME" ] ; then
echo "$FILENAME can not read" 1>&2
usage
exit 1
fi
if echo $LINENUM | grep -q '[^0-9]' ; then
echo "$LINENUM is not a number" 1>&2
usage
exit 1
fi
# LINES
T_NUM=`wc -l "$FILENAME"|awk '{print $1}'`
B_NUM=`expr $T_NUM - $LINENUM + 1`
if [ $DEBUG ] ; then
echo "T_NUM: |$T_NUM| ; B_NUM: |$B_NUM|"
fi
tail -n $B_NUM "$FILENAME" | $FUN_BODY_FINDER
- A hozzászóláshoz be kell jelentkezni
Ja a topik nyitó problémához akartam írni.
- A hozzászóláshoz be kell jelentkezni