Я ищу способ поиска исходного кода без порой ложных срабатываний из-за комментариев. Например, если я ищу 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 работает с чистым текстом и ничего не знает о базовом синтаксисе вашей C-программы. Поэтому, чтобы не искать внутри комментариев, у вас есть несколько вариантов:
Уберите C-комментарии перед поиском, вы можете сделать это, используя
gcc -fpreprocessed -dD -E yourfile.c
Подробнее. Пожалуйста, смотрите /programming/2394017/remove-comments-from-cc-codeНапишите / используйте некоторые хакерские полуработающие скрипты, которые вы уже нашли (например, они работают, пропуская строки, начинающиеся с
//
или/*
), чтобы обрабатывать детали всех возможных комментариев C / C ++ (опять же, смотрите предыдущую ссылку для некоторых страшных тестовых случаев) , Тогда у вас все еще могут быть ложные срабатывания, но вам не нужно ничего предварительно обрабатывать.Используйте более продвинутые инструменты для выполнения «семантического поиска» в коде. Я нашел "coccigrep": http://home.regit.org/software/coccigrep/ Этот вид инструментов позволяет искать некоторые специфические языковые операторы (например, обновление структуры с заданным именем) и, конечно, они сбрасывают комментарии.
источник
Вот конкретный вариант для всех нас, опоздавших на этот вопрос:
Список исходных файлов C
передаются в xargs, который выполняет препроцессор в дочерней оболочке
который впоследствии передается в желаемую команду grep
который затем передается в sed для префикса каждой строки с текущим именем файла
Наконец, все повторяющиеся пустые строки свернуты в одну строку с помощью cat:
Это работает в системе RHEL6, но я предполагаю, что она достаточно общая для других систем * nix.
источник