Как делают меня grep для всего, возможно перенесенного, строки кода?

При поиске кода строки я постоянно сталкиваюсь с проблемой, что я становлюсь бессмысленным, результаты контекста меньше. Например, если вызов функции разделяется через 3 строки, и я ищу название параметра, я получаю параметр на строке отдельно а не названии функции.

Например, в файле, содержащем

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

захват для MY_CONSTANT возвратил бы строку, которая была похожа на это:

                    MY_CONSTANT,

Аналогично, в блоке комментария:

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

Grepping для FIXMESOON дает очень расстраивающий ответ:

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

Когда существуют тысячи хитов, однострочные результаты немного бессмысленны. То, что я хотел бы сделать, имеют grep знать о запуске и точках остановки строк исходного кода, что-то столь же простое как наличие, это рассматривает""; поскольку разделитель строки был бы хорошим началом.

Бонусные очки, если можно заставить его возвратить весь блок комментария, если хит в комментарии.

Я знаю, что Вы не можете сделать этого с одним только grep. Я также знаю об опции иметь возврат grep определенное число строк контекста. Какие-либо предложения о том, как выполнить в соответствии с Linux? К вашему сведению мои предпочтительные языки являются C и Perl.

Я уверен, что мог записать что-то, но я знаю, что кто-то, должно быть, уже сделал это.

Спасибо!

10
задан NXT 22 April 2010 в 04:56
поделиться

4 ответа

Вы можете использовать pcregrep с опцией -M (многострочное сопоставление; pcregrep - это grep с Perl-совместимыми регулярными выражениями). Примерно так:

pcregrep -M ";*\R*.*thingtosearchfor*\R*.*;.*"
3
ответ дан 4 December 2019 в 02:25
поделиться

Вот пример использования 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)

концепция, лежащая в основе: RS - это разделитель записей. установив для него значение «)», каждая запись в вашем файле отделяется символом «)» вместо новой строки. Это упрощает поиск вашей "function1", так как вы можете затем "grep" для нее. Если вы не используете awk, можно применить ту же концепцию, используя «разбиение» на «)».

3
ответ дан 4 December 2019 в 02:25
поделиться

Если это не академическая деятельность, вы можете просто использовать cscope (правда, только для кода C). Если вы хотите отказаться от поиска в комментариях, должно быть достаточно ctags (и он также поддерживает Perl).

1
ответ дан 4 December 2019 в 02:25
поделиться

Вы можете написать командную строку, используя grep с параметрами, которые дадут вам номер строки и имя файла, а затем передать эти результаты в awk для анализа этих столбцов и затем использовать небольшой скрипт от вас, чтобы отобразить N строк, окружающих эту строку? :)

1
ответ дан 4 December 2019 в 02:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: