gpt4 book ai didi

python - 通过 Shell 在所有函数的开头和结尾添加日志语句

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:17:52 25 4
gpt4 key购买 nike

我有一个项目,其中有超过 1000 个源 C++ 文件存储在同一目录下的不同文件夹中。我想将日志代码添加到这些 .cpp 文件中定义的所有函数的开头和结尾。请参见下面的示例:

    //SomeSrcFile.cpp      
//Sample
ReturnType SomeClass::SomeFunc1(InputParameters)
{
......
}

ReturnType SomeClass::SomeFunc2(InputParameters) {
......
}

输出

    ReturnType SomeClass::SomeFunc1(InputParameters)     
{
char FuncName[] = "SomeClass::SomeFunc1()"; //line added
printf("%s begins\n", FuncName); //line added

......

printf("%s ends\n", FuncName); //line added
}

ReturnType SomeClass::SomeFunc2(InputParameters) {
char FuncName[] = "SomeClass::SomeFunc2()"; //line added
printf("%s begins\n", FuncName); //line added

......

printf("%s ends\n", FuncName); //line added
}

这种工作的shell脚本怎么写?这里可以用awk吗?

更新

  1. 我认为可以像 This Post 这样通过 AWK 来完成 确实如此。但我还没有想出如何以我的方式做到这一点。

  2. 我只想使用 Bash 或 Python 来执行此操作,因为它们只是我现在熟悉的工具。

更新 2
也许这份工作真的很辛苦,出乎我的意料。但是,如果我不关心准确性怎么办?如果我不关心 Functions 包含在评论等中的情况怎么办?有没有一种简单的方法可以做到这一点?

最佳答案

如果你不介意它不健壮,这将做你想要的简单一致的情况,使用 GNU awk 作为第三个参数来匹配()和字符类的缩写(例如 \w):

$ cat tst.awk
BEGIN {
beg = "\tchar FuncName[] = \"%s()\";\n\tprintf(\"%%s begins\\n\", FuncName);\n"
end = "\n\tprintf(\"%%s ends\\n\", FuncName);"
}
match($0,/^\s*\w+\s+(\w+::\w+)[(][^)]*[)]/,arr) { funcName = arr[1] }
/{/ && (++braceCnt == 1) { $0 = $0 ORS sprintf(beg,funcName) }
/}/ && (--braceCnt == 0) { $0 = sprintf(end,funcName) ORS $0 }
{ print }

.

$ awk -f tst.awk file
//SomeSrcFile.cpp
//Sample
ReturnType SomeClass::SomeFunc1(InputParameters)
{
char FuncName[] = "SomeClass::SomeFunc1()";
printf("%s begins\n", FuncName);

......

printf("%s ends\n", FuncName);
}

ReturnType SomeClass::SomeFunc2(InputParameters) {
char FuncName[] = "SomeClass::SomeFunc2()";
printf("%s begins\n", FuncName);

......

printf("%s ends\n", FuncName);
}

对于其他 awk,只需使用 [[:space:]] 而不是 \s[[:alnum:]_]正则表达式中的 \w 并结合使用 match()substr() 和/或 sub()s 从匹配正则表达式的字符串中提取函数名,例如:

$ cat tst2.awk
BEGIN {
beg = "\tchar FuncName[] = \"%s()\";\n\tprintf(\"%%s begins\\n\", FuncName);\n"
end = "\n\tprintf(\"%%s ends\\n\", FuncName);"
}
/^[[:space:]]*[[:alnum:]_]+[[:space:]]+([[:alnum:]_]+::[[:alnum:]_]+)[(][^)]*[)]/ {
funcName = $0
gsub(/^[[:space:]]*[[:alnum:]_]+[[:space:]]+|[(][^)]*[)].*/,"",funcName)
}
/{/ && (++braceCnt == 1) { $0 = $0 ORS sprintf(beg,funcName) }
/}/ && (--braceCnt == 0) { $0 = sprintf(end,funcName) ORS $0 }
{ print }

关于python - 通过 Shell 在所有函数的开头和结尾添加日志语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27338752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com