Как упоминалось в комментариях выше, формат "комментариев" в вашем случае имеет значение. Тем не менее, для некоторых случаев этого может быть достаточно, без необходимости создавать скрипт.
Читая вопрос, можно предположить, что вы уже используете grep
для поиска файлов, так что передайте его через другой grep
; примерно так:
grep your_pattern your_file | grep --perl-regexp --invert-match '(?:^;)|(?:^\s*/\*.*\*/)|(? :^\s*#|//|\*)'
Это все равно разрешит строки или строки, которые имеют символ "триггер" в другом месте строки, которые имеют комментарии в конце, как в echo "Hello World" # другой комментарий
, или которые являются частью многострочного комментария (кроме случаев, отмеченных в объяснении ниже.
Если это используется в качестве пост-фильтра для grep, то эти ограничения должны быть незначительными, так как большинство комментариев будет отфильтровано, и вы больше не будете беспокоиться о том, "что ваши глаза остекленеют".
Есть три шаблона, которые при необходимости можно модифицировать в соответствии с вашим случаем использования. Первый (?:^;)
отлавливает строки, начинающиеся с символа ;
. Должен быть первым, без пробелов. Второй отлавливает строки, начинающиеся с `/* ... */` в стиле комментария, с пробелами или без них. Третий
отлавливает строки, начинающиеся с #
, //
или *
, с пробелами или без них. *
в последнем шаблоне помогает поймать строку внутри многострочного комментария в /* ... */
, где обычно используется столбец *
для соединения первой и последней строки вместе. Например:
/************
*
* This is my
* multi-line
* comment.
*
************/
Обозначение (? ... )
вокруг каждого шаблона делает их "не захватывающими" шаблонами, в надежде увеличить скорость и уменьшить потребление ресурсов. Аргументы -Pv
в grep указывают ему использовать правила регулярных выражений Perl --perl-regexp
, что позволяет группировать не захватывающие шаблоны и позволяет работать оператору чередования |
, ни один из которых не работает в CLI grep. На странице руководства grep есть предупреждение, что опция -P является экспериментальной, поэтому проверьте ее, прежде чем использовать в своей системе. Опция --invert-match
указывает grep
на обратное соответствие, возвращая строки, которые не соответствуют шаблону. Их можно объединить и сократить до -vP
.
Причина использования этого фильтра в качестве постфильтра к обычному grep
заключается в трех моментах. Во-первых, вы можете делать обычную выборку и добавлять дополнительную работу по использованию этого фильтра только тогда, когда вы столкнетесь с проблемой слишком большого количества комментариев в выводе. (Меньше ввода и меньше используемых ресурсов). Во-вторых, вы, вероятно, уже разработали шаблоны, которые часто используете, и привычки, которые с ними связаны, и добавление дополнительных сложностей может их нарушить. Добавление дополнительной работы по отладке паттернов, когда в этом нет необходимости, является напрасной работой. В-третьих, он не очень хорошо работает с многострочными комментариями, но если вы уже искали в файле то, что вам нужно, то он удалит большинство, если не все, комментарии из результатов и послужит вашей цели.