Regex 在具有给定扩展名的所有文件中单独查找函数名

Regex 在具有给定扩展名的所有文件中单独查找函数名,regex,shell,find,Regex,Shell,Find,我试过了 find "$1" -print | grep -i '.*[.]c' | sort 查找文件夹中所有扩展名为.c的文件 1) 但我还需要打印出每个c文件的内容。例如,假设测试文件夹中有“practice.c”和“practice_1.c”文件 test/practice.c: void function(int loc) int function1() test/practice_1.c: void function2() char function3(char locc)

我试过了

find "$1" -print | grep -i '.*[.]c' | sort
查找文件夹中所有扩展名为.c的文件

1) 但我还需要打印出每个c文件的内容。例如,假设测试文件夹中有“practice.c”和“practice_1.c”文件

test/practice.c:

void function(int loc)
int function1()

test/practice_1.c:

void function2()
char function3(char locc)
像这样。。。我只需要打印出函数名,而不是所有的内容。 如果我使用-exec cat,它会打印出它的所有内容,所以我被困在这里

-----------------------编辑--------------------------------------

find "$1" -type f -name *.c -exec echo {} \; -exec grep "(*)" {} \; | sed 's/{//g'
当我使用上面的代码时,它打印为

test/practice.c
void function(int loc)
int function1()
test/practice_1.c
void function2()
char function3(char locc)
如何将其输出为:

test/practice.c:
void function(int loc)
int function1()

test/practice_1.c:
void function2()
char function3(char locc)
(需要在文件名后添加分号,并在一个文件显示完成后添加新行…)

查找C文件 首先,不要grep
查找
的输出。您可以改用
find
-iname
选项。要允许文件名中包含换行符,请使用
-print0
而不是
-print

find "$1" -iname '*.c' -print0 | sort -z
但还有一种更好的方法:
bash
的globstar(请参见将事物组合起来)

打印功能 在这种情况下,最好使用一个专用程序,而不是将某些东西拼凑在一起。或者看起来很适合这份工作
ctags
输出依赖于文件的格式,因此我们使用
indent
自动格式化它们

find "$1" -iname '*.c' -print0 | sort -z
要从一个文件中打印函数定义(如示例中所示),请使用以下函数:

printFunctions() {
    printf "%s:\n\n" "$1"             # filename at the top
    indent -l0 -npsl < "$1" > tmp.c
    ctags -x tmp.c |
    awk '$2 == "function"' |
    tr -s ' ' |
    cut -d' ' -f5-
    rm tmp.c
    echo                              # empty line at the end
}

试试这个。如果这符合你的标准

find "$1" -type f -name *.c -exec echo {}":" \; -exec grep "(*)" {} \; |sed 's/{//g' | awk '{if(($0~/:/)&&(NR>1)){$0="\n"$0};print}'
查找“$1”-键入f-name*.c-exec echo{}”:“\####这将在$1文件夹中找到所有.c文件。所以*.c表示以.c结尾的文件名,并且在输出的文件名中附加:in

-exec grep“(*)”{}\#####这将在搜索的文件中显示两个圆括号(和)的行,我们在命令c函数语法中使用这两个圆括号

|sed的/{//g'
#####所有搜索到的内容都通过管道传输到此sed命令。由于函数名在其名称声明后有{,因此在此处删除它


awk'{if($0~/:/){$0=“\n”$0};print}“
#####这里我们在第一行的开头加上:

你需要把你的问题分成两部分。第一部分更像是一个正则表达式问题,以匹配函数原型,然后列出文件。你应该把它分开,并在问题上添加
regex
标记谢谢!但这一部分打印出了问题的所有内容像:#include,但我只需要打印函数名;)这样的文件有什么办法解决这个问题吗?我在回答中添加了grep“(*)”。你必须给我regex来识别函数。我可以在grepIt中添加相同的regex,只打印函数名,但{添加在函数名的末尾,比如:char*file(char*name){是否仍有删除{?我所做的是:查找“$1”-键入f-name.c-printf“$1:\n”-exec grep”(“{}\)| sed's/{//g'但这不打印文件名,只打印文件夹名…您能告诉我如何修复此问题吗?printf$1将只打印$1而不是其中的文件。我的代码有什么问题?是否需要使用print$1?挑剔:默认的awk操作是
打印
,因此不需要
{print}
。它还将忽略C中的void main()或int main()函数,因为在这些行中,$2将不等于“function”。@ShravanYadav我刚刚用
int main()
void main()
int main(int argc,char*argv[])尝试了我的函数
。这三个版本都列为函数。
ctags-x
在您的系统上打印什么?ctags很好,但是awk只会用$2==“function”过滤行。@ShravanYadav
awk
部分也应该是正确的。正如我所说,
printformations yourFile.c
将打印
int main()
如果文件中有函数
int main()
。请注意,
ctag-x
在第二列中为每个函数加上关键字
function
,无论函数的名称是什么。