shell脚本中使用grep -rnw中查找test.c文件中使用system函数,但是需要过滤掉//和/* */注释行中的system函数,应该如何实现
时间: 2024-10-13 22:14:14 浏览: 10
在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[^;]*\)\).*/'
```
阅读全文