shell脚本如何过掉grep -rnw 的搜索C语言文件结果中的注释行,例如//或/* */的注释行
时间: 2024-10-14 09:03:13 浏览: 32
在shell脚本中,如果你想通过`grep`命令过滤掉C语言文件中的注释行,可以利用`egrep`(Extended grep)或者正则表达式来实现这个功能。这里假设你想要排除单行注释(以`//`开头)和多行注释(以`/*`开始并包含`*/`结束)。你可以这样做:
```bash
grep -rnw . --exclude='*.h' --exclude='*.cpp' --exclude='*.c' \
--line-regexp "^(?!\/\/).*(?<!\/\*)[^*]*\*(?!\/)" \
你的目录路径
```
解释一下这里的选项:
- `-r` 表示递归查找当前目录及其子目录。
- `-n` 显示匹配行的行号。
- `-w` 确保只匹配整个单词。
- `--exclude=pattern` 排除指定模式的文件,这里是排除.h、.cpp和.c文件,因为通常注释不会出现在头文件里。
- `--line-regexp` 指定使用正则表达式的行级匹配。
- 正则表达式部分 `"^(?!\/\/).*(?<!\/\*)[^*]*\*(?!\/)"` 是关键:
- `(?!\/\/)` 防止匹配以`//`开头的行。
- `.*` 匹配任意字符直到找到非注释结束。
- `(?<!\/\*)` 避免匹配在`/*`前的内容,即多行注释开始的地方。
- `[^*]*` 匹配不是星号的字符,排除多行注释内部内容。
- `\*(?!\/)` 确保不匹配`*/`,避免错误地结束多行注释。
相关问题
shell脚本如何过掉grep -rnw 的搜索C语言文件结果中的注释行
在shell脚本中,如果想要使用 `grep -rnw` 过滤掉C语言文件(通常是`.c`或`.h`)中的注释行,你可以结合正则表达式来实现。C语言中的注释通常有两种形式:单行注释(以 `//` 开始)和多行注释(以 `/*` 开始并以 `*/` 结束)。下面是一个简单的例子,展示如何使用grep排除这两种类型的注释行:
```bash
grep -rnw '/path/to/search/directory' -v --include=*.c --include=*.h \
-e '^(?!\/\*).*(\/\/|$)' \
-e '^$'
```
这里做了以下调整:
- `-v` 或 `--invert-match`: 否定匹配,即返回不包含指定模式的结果。
- `--include=*.c` 和 `--include=*.h`: 只搜索指定扩展名的文件,避免处理非源码文件。
- `-e`: 针对每个单独的模式,这里有两个模式:
- 第一个模式 `(?!\/\*).*(\/\/|$)` 匹配除了以 `/*` 开始的行之外的任何行,这将排除多行注释。
- 第二个模式 `^$` 匹配空白行,因为注释行的末尾通常会有空行。
请注意,这种方法可能会误删一些特殊情况,比如多行注释内部有实际内容的情况。如果你需要更精确的过滤,可能需要借助专门处理C/C++语法解析的库。
shell脚本中使用grep -rnw中查找test.c文件中使用system函数,但是需要过滤掉//和/* */注释行中的system函数,应该如何实现
在shell脚本中,使用`grep`命令查找`test.c`文件中system函数,并排除注释行,可以结合`egrep`(extended grep)选项来实现这个需求。假设我们想查找不包含在单行或多行注释中的`system()`调用,可以尝试以下命令:
```bash
grep -rnw --exclude='*.c.in' --exclude-dir=\.git --exclude-dir=.svn --line-buffered test.c \
| egrep -v '/\*.*system\(.*\).*\*/|/\(//.*system\(.*\)'.*
```
这里解释一下各个参数:
- `-r`:递归搜索目录及其子目录。
- `-n`:显示匹配行的行号。
- `-w`:只匹配整个单词,避免部分匹配。
- `--exclude='*.c.in'`:排除`.c.in`类型的文件,通常是临时或未完成的源文件。
- `--exclude-dir=\.git` 和 `--exclude-dir=.svn`:排除版本控制系统中的隐藏目录。
- `--line-buffered`:提高处理大文件性能。
- `egrep`:用于更复杂的正则表达式匹配。
- `/.../`:正则表达式模式,`/\*.*system\(.*\).*\*/` 匹配多行注释(`/* ... */`),`/\(//.*system\(.*\)`.*/` 匹配单行注释(`// ...`)。
- `-v`:否定规则,即排除上述注释中的`system`调用。
如果你只想找出实际的`system`函数调用行,而不是匹配字符串`system`的行,可以在`system\(.*\)`这部分增加精确的函数调用匹配:
```bash
grep -rnw --exclude='*.c.in' --exclude-dir=\.git --exclude-dir=.svn --line-buffered test.c \
| egrep -v '/\*.*system\(void[^;]*\);.*\*/|/\(//.*system\(void[^;]*\)\).*/'
```
阅读全文