条件模式匹配

条件模式匹配

我想找到包含字符串的文件,并且该字符串不能在注释部分中。例如:要匹配的字符串 = 'Map'

  1. /* aoeuaeu 地图 */
  2. // 映射 aoeuoeu
  3. uoeu = 地图 + 2

grep 应该只匹配 3。

我试过:

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

编辑 我发布的案例是参考,我的意思是字符串地图在cpp代码中使用

答案1

使用这篇文章作为参考,

https://stackoverflow.com/questions/2394017/remove-comments-from-cc-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 ^#.我将其包含在这里只是为了排除通过预处理器运行文件时输出的注释行。

答案2

以下版本涵盖了一般的简单情况

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

正如 @MikeA 所指出的(请参阅他的解决方案),某些情况需要 C 预处理器甚至 cpp-parser 示例嵌套注释、字符串中的注释。

搜索.md项目树中的所有内容(假设简单的名称......)

perl ....  $(find -name="*.md")

相关内容