Условное сопоставление с образцом

Я хочу найти файлы, содержащие строку, и эта строка не должна находиться в разделе комментариев. Например: string to match = 'Map'

  1. / * aoeuaeu Map * /
  2. // Map aoeuoeu
  3. uoeu = Map + 2

grep должно соответствовать только 3.

Я пробовал:

grep -r --include=*.mc "^.*[^\/][^\*].*\sMap"

EDIT случаи, которые я опубликовал, являются ссылками, я имею в виду, что строка Map используется в коде cpp

0
10.09.2016, 00:56
2 ответа

Используя этот пост в качестве ссылки,

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 ^#. Я включил его сюда, чтобы исключить строку комментария, которая выводится, когда вы прогоняете файл через препроцессор.

1
28.01.2020, 02:47

Приведенные ниже версии охватывают общие простые случаи

perl -n0E 's!//.*!!g; 
           s!/\*.*?\*/!!gs; 
           say $ARGV if /Mat/'   *.c *.md  

Как указал @MikeA (пожалуйста, посмотрите его решение), в некоторых ситуациях нужен C-препроцессор или даже cpp-парсер Пример вложенных комментариев, комментариев в строках.

Чтобы просмотреть все .md в дереве вашего проекта (предполагая простые имена... )

perl ....  $(find -name="*.md")
0
28.01.2020, 02:47

Теги

Похожие вопросы