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

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

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

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

  • grep-файлы, содержащие текст без комментария
  • Удалить файлы, более новые, чем X день и час
  • Сценарий оболочки: «если файл не используется»
  • Совместное использование локального каталога между локальными пользователями с полными разрешениями
  • Суммарно байт файлов
  • Как заменить символическую ссылку на копию файла, к которому он привязан?
  • Мне нужно использовать классические инструменты для скриптинга (awk, sed, bash, grep и т. Д.), И мне нужно, чтобы он был быстрым, даже если есть тысячи файлов.

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

  • Проверка большого каталога после копирования с одного жесткого диска на другой
  • find command, есть ли способ получить отчет о проделанной работе?
  • Как скопировать использование для цикла?
  • Как grep наиболее часто встречающиеся сообщения об ошибках в файле журнала unix
  • странный шум в некоторых программах gui
  • Необходимость grep-файла с конкретным письмом и переход в другую папку Linux
  • 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 - лучшая ОС в мире.