2010-04-22 9 views
9

Podczas wyszukiwania kodu dla ciągów nieustannie napotykam problem, który powoduje, że uzyskuję pozbawione znaczenia, pozbawione kontekstu wyniki. Na przykład, jeśli wywołanie funkcji jest podzielone na 3 linie, a ja szukam nazwy parametru, otrzymuję parametr sam w sobie, a nie nazwę funkcji.Jak przeglądać całe, ewentualnie zapakowane wiersze kodu?

na przykład w pliku zawierającym

... 
    someFunctionCall ("test", 
        MY_CONSTANT, 
        (some *really) - long/expression); 

grepping do MY_CONSTANT powróci do linii, która wyglądała następująco:

    MY_CONSTANT, 

Podobnie, blok komentarza:

///////////////////////////////////////// 
// FIXMESOON, do..while is the wrong choice here, because 
// it makes the wrong thing happen 
///////////////////////////////////////// 

Grpping dla FIXMESOON daje bardzo frustrującą odpowiedź:

// FIXMESOON, do..while is the wrong choice here, because 

Kiedy są tysiące trafień, wyniki pojedynczej linii są trochę bez znaczenia. Chciałbym, żeby grep wiedział o punktach początkowych i końcowych linii kodu źródłowego, coś tak prostego, jak o to, by rozważyć ";" jako że separator linii byłby dobrym początkiem.

Punkty premiowe, jeśli możesz zwrócić cały blok komentarza, jeśli trafienie znajduje się wewnątrz komentarza.

Wiem, że nie można tego zrobić z samym grep. Mam również świadomość, że grep zwraca pewną liczbę linii kontekstu. Wszelkie sugestie, jak osiągnąć w Linuksie? Dla moich preferowanych języków są C i Perl.

Jestem pewien, że mógłbym coś napisać, ale wiem, że ktoś już to zrobił.

Dzięki!

+3

wiem, ale to jest dobre pytanie! – mpen

+1

zamiast dobrego rozwiązania, zawsze możesz użyć grepowego '-C n' dla' n' linii kontekstu –

Odpowiedz

3

Możesz użyć pcregrep z opcją -M (dopasowywanie wielowierszowe, pcregrep jest grep z zgodnymi z Perl wyrażeń regularnych). Coś jak:

pcregrep -M ";*\R*.*thingtosearchfor*\R*.*;.*" 
+0

Chłodny, jakoś nigdy nie wiedział o pcregrep. Uwielbiam podpowiedź użycia: 'Użycie: pcregrep [-ABCcDdeFfHhilLMNnoqrsuVvwx] [długie opcje] [wzór] [pliki]'. Zawsze dobrze wiedzieć, jakie znaki są poprawnymi opcjami! – Cascabel

+0

... * tak *, opcja rozdęta, jaka zabawa. –

+0

@wash - co opcja opcji wzdęcia ??? Nadal mają niewykorzystane 20 znaków! – DVK

1

Możesz napisać wiersz poleceń używając grep z opcjami, które dają ci numer wiersza i nazwę pliku, a następnie przeliczyć te wyniki na awk, aby przeanalizować te kolumny, a następnie użyć małego skryptu, aby wyświetlić N linii otaczających to linia? :)

1

Jeśli nie jest to przedsięwzięcie akademickie można po prostu użyć cscope (dla kodu C tylko chociaż). Jeśli chcesz zrezygnować z wymogu wyszukiwania w komentarzach, to powinno wystarczyć (i obsługuje także Perl).

3

Oto przykład użycia awk.

$ cat file 
blah1 
blah2 
    function1 ("test", 
        MY_CONSTANT, 
        (some *really) - long/expression); 

function2(one , two) 
blah3 
blah4 

$ awk -vRS=")" '/function1/{gsub(".*function1","function1");print $0RT}' file 
function1 ("test", 
        MY_CONSTANT, 
        (some *really) 

Koncepcja za: RS jest separatorem rekordów. ustawiając go na ")", wtedy każdy rekord w pliku jest oddzielony przez ")" zamiast znaku nowej linii. Ułatwia to znalezienie twojej "funkcji1", ponieważ możesz "grep" dla niej. Jeśli nie używasz awk, ta sama koncepcja może być zastosowana za pomocą "dzielenia" na ")".

0

Miałem sytuację, w której miałem plik xml pełen nazw plików zip w formacie xml, tzn. Z marchewką bracketing nazwy plików, na przykład.zip < \ rzeczy>

użyłem awk zmienić wszystkie marchewki w nowej linii następnie używany grep :)

Powiązane problemy