2015-05-26 3 views
-6

Есть ли способ поиска строки только внутри определения функции. Я хочу сказать, что есть ac-файл ac ac, в котором есть определение нескольких функций, но я хочу вывод поиска только тогда, когда эта строка присутствует внутри определенной функции (скажем, do_something()), есть ли какая-либо способ поиска строки, например, из командной строки?
, например, для следующего кода:поиск строки только внутри функции определения

#include <stdio.h> 
void f(int n, 
     int j, 
     int k) 
{ 
    printf("name is is pankaj "); 
    printf("name is is kumar "); 
    printf("name is is mayank "); 
} 
int main() 
{ 
    printf("name is is pankaj "); 
    return 0; 
} 

для указанной программы, я хочу только одно вхождения Панкаджа, который присутствует в функции f(), я не хочу Панкая присутствующий в основной функции в качестве выходного сигнала поиска , Просьба игнорировать любую семантическую или синтаксическую ошибку в программе, мой запрос предназначен только для поиска строки в программе.

+2

По кодировке, что вы пробовали? – dnuka

+0

Я не пробовал ничего, было просто интересно узнать, как если бы я делал grep «kumar» ac, чем он даст всю видимость кумара в ac, есть ли способ сочетания регулярного выражения, чтобы я мог заставить мой grep смотреть только внутри определения функции? –

ответ

0

Конечно, попробуйте следующее:

$0 ~ fun { 
    count = 1 
    while (! ($0 ~ /{/)) 
     getline 
    getline 
} 

count > 0 { 
    if ($0 ~ /{/) 
     count++ 
    if ($0 ~ /}/) 
     count-- 
    if ($0 ~ query) 
     print FILENAME ": l" FNR ". " $0 
} 

и вызвать скрипт так:

awk -v query="pankaj" -v fun="void f[(]" -f script.awk inputfile.java 

Где query это строка для поиска и fun регулярное выражение для имени функции.

Этот скрипт насчитывает { и }, чтобы увидеть, когда мы выйдем из функции, и должна распечатать строку, если совпадение найдено.

Редактировать: вы можете расширить регулярное выражение для подсчета скобок, возможно, потребуется дополнительная проверка, чтобы увидеть, не помещены ли они в комментариях (хотя вы этого никогда не сделаете).

+0

Я пробовал это в заданной программе (теперь редактировал Q), но не работает. –

+0

Правильно, забыл о многострочных функциях. Попробуй. – ShellFish

+0

спасибо alo shellfish :) его рабочий тон :) –