我有大量的C文件,其结构遵循以下原则:
一个可行的可视化将是(注意空格):
int ksz_Print(...)
{
...
}
void ksz_Print_Helper1 (... ){
...
}
void ksz_Print_Helper2(...) {
...
}
int ksz_Input(...){
...
}
double ksz_Input_Helper1 ( ...){
...
}
我需要找到" main"每个C文件的函数名称,以便将它们用于另一个搜索算法。 由于这些文件很大(它们的数量超过十几行)并且有数百个 - 我需要一个Bash脚本。
理想情况下,此脚本只会提取" main"功能:
ksz_Print
ksz_Input
阻止我的是我无法想到 grep 的正则表达式以便提取功能线。我认为它的逻辑应该是这样的:
(spaces)(int / float / double)(spaces)(ksz _)(其他没有空格的characers)(空格)(open bracket)
之后我想我会提取包含" ksz _"来自 cut 的每一行(修剪并删除重复的空格后)。
最后,我需要找到一种方法来过滤掉支持功能。
但是这个剧本中我最初的grep是什么?
答案 0 :(得分:0)
如果我理解你的规格,应该这样做:
root@local [~]# awk '/^[ \t]*(int|float|double)[ \t]+ksz_/ {print $2}' sample.txt
我不明白的一件事是在ksz之后是否应该只有一个“_”,例如,如果“double ksz_Input_Helper1”不是你想要匹配的东西。在上面的正则表达式中它确实匹配。
我还选择使用awk而不是grep,因为你说你只想要上面awk的名字,只使用空格作为分隔符打印第二个字段。如果你仍然想使用grep,那么这个任务就完成了:
root@local [~]# egrep '^\s*(int|float|double)\s+ksz_' sample.txt
这是一个细分(在awk中注意我使用[\ t]代替\ s,因为我无法识别\ s]:
^ - match start of line
\s* - match if there are 0 or more white spaces
(int|float|double) - match int, float, OR double
\s+ - match at least one whitespace
ksz_ - match literal string "ksz_"
答案 1 :(得分:0)
尝试使用仅匹配所需部分的正则表达式,并仅打印:
grep -oRE "(ksz_[a-zA-Z_]*\b)" *
-o - output only match
-R - recursive
-E - regex
[a-zA-Z_] - upper and lower case letters, underscore
\b - ending at word boundry