在具有给定扩展名

时间:2018-03-21 10:33:53

标签: 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)
像这样...我只打印出函数名,而不是所有内容。 如果我使用-exec cat,它会打印出所有内容,所以我被困在这里。

----------------------- edit ----------------------- ---------------

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)

(需要在文件名后添加分号,并在完成一个文件显示后添加新行...)

2 个答案:

答案 0 :(得分:1)

查找C文件

首先,不要{gre} find的输出。您可以改用find' -iname选项。要允许其中包含换行符的文件名,请使用-print0代替-print

find "$1" -iname '*.c' -print0 | sort -z

但还有更好的方法:bash的globstar(参见将事情放在一起)。

打印功能

在这种情况下,最好使用专用程序而不是一起黑客攻击。 ctags -xcscope似乎可以胜任这项工作。 ctags输出依赖于文件的格式,因此我们使用indent自动格式化它们。

要从示例中打印函数定义,请使用以下函数:

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
}

把事情放在一起

short -s globstar
for cfile in **/*.c; do
    printFunctions "$cfile"
done

答案 1 :(得分:0)

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

find "$1" -type f -name *.c -exec echo {}":" \; -exec grep "(*)" {} \; |sed 's/{//g' | awk '{if(($0~/:/)&&(NR>1)){$0="\n"$0};print}'

find "$1" -type f -name *.c -exec echo {}":" \; ###这将找到$ 1文件夹中的所有.c文件。所以* .c表示以.c结尾的文件名,它还附加:输出中的文件名。

-exec grep "(*)" {} \; ###这将在搜索的文件中grep,其中包含(和)我们在命令c函数语法中使用的两个圆括号

| sed 's/{//g' ###搜索到的所有内容都通过管道输入到这个sed命令。由于函数名称具有{在其名称声明之后所以将其删除

awk '{if($0~/:/){$0="\n"$0};print}' ###这里我们在行的开头附加\ n,其中包含: