Как я grep для всей, возможно, обернутые строки кода? - PullRequest
10 голосов
/ 22 апреля 2010

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

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

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

grepping для 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.

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

Спасибо!

Ответы [ 5 ]

3 голосов
/ 22 апреля 2010

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

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

pcregrep -M ";*\R*.*thingtosearchfor*\R*.*;.*"
1 голос
/ 22 апреля 2010

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

1 голос
/ 22 апреля 2010

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

0 голосов
/ 29 января 2013

У меня была ситуация, в которой у меня был xml-файл, полный имен zip-файлов в формате xml, то есть, когда морковь заключала в скобки имена файлов, например, example.zip <\ stuff>

Я использовал awk, чтобы преобразовать всю морковь в новые строки, затем использовал grep:)

...