Как использовать 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)?
  • JDK 1.4.2 - где я могу скачать источник?
  • Где исходный код реализации «scanf»?
  • Учитывая git commit hash, как узнать, какая версия ядра содержит его?
  • Могу ли я использовать yum для управления «пакетом», установленным из источника
  • Pipe Python Shell для подсветки источника
  • Где я могу получить исходный пакет для инструмента Perf
  • 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.

    Interesting Posts

    Как подключиться к фотоаппарату Sony через Wi-Fi от Linux

    Почему «apt-get autoremove» работает неправильно?

    Что GDIR, GREG, VDIR, VREG означают в выводе

    Какие директора FHS я могу передать на аутсорсинг и как?

    Пользовательский сервис (systemd) не запускается при запуске

    Почему комбинация tail + grep + cut не работает?

    Как остановить Mod4-P от переключения дисплея?

    Ubuntu 16.04.1: Kernel panic – не синхронизация: Попытка убить init!

    Debian stucks при форматировании 33%

    Как создать скрипт, который использует $ 0, когда он находится на $ PATH?

    Как работают демоны с учетной записью пользователя с недопустимой оболочкой?

    Сложность создания регулярного выражения для поиска по меньшей мере двух вхождений символа в файл

    Не прекращайте make'ing, если команда не работает, но проверьте статус выхода

    Как установка бита Setuid влияет на сценарии оболочки, которые запускаются при загрузке системы, до того, как произошел какой-либо логин?

    Asus Bluetooth Dongle с чипом Atheros (ath3k) – пробник с открытым кодом OpenSUSE с ошибкой -5

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