Как использовать grep для исходного кода без комментариев

Я ищу способ grep на исходный код, не имея иногда ложноположительных из-за комментариев. Например, если я искал foo для этого .c исходного кода:

/* * foo has changed [...] and is now a 2-parameters function */ // foo(24) foo(42, 28); 

Наивный grep найдет 3 события, в которых я хочу только один. Я видел этот способ сделать это на StackOverflow, но он не отвечает моим потребностям: PHP недоступен на платформе. Я также нашел этот способ для однострочных комментариев, но он решает только часть моей проблемы.

Мне нужно использовать классические инструменты для скриптинга (awk, sed, bash, grep и т. Д.), И мне нужно, чтобы он был быстрым, даже если есть тысячи файлов.

Вы сейчас, если и как можно grep на исходный код и только исходный код?

  • Поиск исходного источника ядра
  • Распаковка автономной системы rpm (OpenSuse)?
  • Учитывая git commit hash, как узнать, какая версия ядра содержит его?
  • Pipe Python Shell для подсветки источника
  • Почему «make» жалуется на недостающее правило, когда я пытаюсь создать программу из источника?
  • Приложение GNOME / GTK установлено из исходных запусков с темой по умолчанию
  • Объединение текстовых файловых каталогов
  • Получить исходный код ядра: apt-get install vs apt-get source
  • 3 Solutions collect form web for “Как использовать grep для исходного кода без комментариев”

    Вы можете попробовать наивный подход для соответствия комментариям следующим образом:

      $ egrep -v "^(//|/\*| \*)" sourcecode 

    Это будет только обратное совпадение с префиксными комментариями – это строки, начинающиеся с // , /* , * или */ – и, следовательно, они не оставят блоки, которые закомментированы с помощью /* и */ pair.

    grep работает с чистым текстом и ничего не знает о базовом синтаксисе вашей C-программы. Поэтому, чтобы не выполнять поиск внутри комментариев, у вас есть несколько вариантов:

    1. Разделите C-комментарии перед поиском, вы можете сделать это с помощью gcc -fpreprocessed -dD -E yourfile.c Подробнее см. https://stackoverflow.com/questions/2394017/remove-comments-from-cc-code.

    2. Напишите / используйте некоторые хакерские полуработающие скрипты, как вы уже нашли (например, они работают, пропуская строки, начинающиеся с // или /* ), чтобы обрабатывать детали всех возможных комментариев на C / C ++ (опять же, см. Предыдущую ссылку для некоторые страшные тест-площадки). Тогда у вас все еще могут быть ложные срабатывания, но вам не нужно предварительно обрабатывать что-либо.

    3. Используйте более сложные инструменты для выполнения «семантического поиска» в коде. Я нашел «coccigrep»: http://home.regit.org/software/coccigrep/ Этот вид инструментов позволяет искать некоторые специфические формулировки языка (например, обновление структуры с заданным именем) и, конечно же, они отбрасывают комментарии.

    Вот конкретный вариант для всех остальных из нас, кто пришел к этому вопросу:

     ls -1 src/*.c | xargs -i sh -c "echo;gcc -fpreprocessed -dD -E {} 2>&1 | grep -wi -e one -e two -e three -n | sed 's:^:{}\::'" | cat -s 

    Список, если исходные файлы C

     ls -1 src/*.c 

    передаются по протоколу xargs, который выполняет препроцессор в дочерней оболочке

     gcc -fpreprocessed -dD -E {} 2>&1 

    который впоследствии передается в желаемую команду grep

     grep -wi -e one -e two -e three -n 

    который затем передается в sed для префикса каждой строки с текущим именем файла

     sed 's:^:{}\::' 

    Наконец, все повторяющиеся пустые строки сворачиваются в одиночные строки с помощью cat:

     cat -s 

    Это работает на системе RHEL6, но я предполагаю, что это достаточно общее для других систем * nix.

    Linux и Unix - лучшая ОС в мире.