Я хочу найти файлы, содержащие строку, и эта строка не должна находиться в разделе комментариев. Например: string to match = 'Map'
grep должно соответствовать только 3.
Я пробовал:
grep -r --include=*.mc "^.*[^\/][^\*].*\sMap"
EDIT случаи, которые я опубликовал, являются ссылками, я имею в виду, что строка Map используется в коде cpp
Используя этот пост в качестве ссылки,
https://stackoverflow.com/questions/2394017/remove-comments-from-c-c-code
Используйте препроцессор для удаления комментариев из вашего исходного файла, затем передайте его в grep для поиска искомого шаблона.
sh-4.3$ cat source.c
/*
* aoeuaeu Map
*/
// Map aoeuoeu
uoeu = Map + 2
aeiou Int; // Map
sh-4.3$ gcc -fpreprocessed -dD -E source.c | grep -v ^# | grep Map
uoeu = Map + 2
sh-4.3$
Возможно, вам не понадобится grep -v ^#
. Я включил его сюда, чтобы исключить строку комментария, которая выводится, когда вы прогоняете файл через препроцессор.
Приведенные ниже версии охватывают общие простые случаи
perl -n0E 's!//.*!!g;
s!/\*.*?\*/!!gs;
say $ARGV if /Mat/' *.c *.md
Как указал @MikeA (пожалуйста, посмотрите его решение), в некоторых ситуациях нужен C-препроцессор или даже cpp-парсер Пример вложенных комментариев, комментариев в строках.
Чтобы просмотреть все .md
в дереве вашего проекта (предполагая простые имена... )
perl .... $(find -name="*.md")