从C源中删除特定函数的所有实例 背景

从C源中删除特定函数的所有实例 背景,c,bash,awk,sed,strip,C,Bash,Awk,Sed,Strip,我有一个测试应用程序,它涉及来自几个独立承包商的库。每个承包商都编写了一个库,该库使用了我已经提供的通用日志API。在构建时,我可以传递一个完全优化日志调用的标志,因为它们是封装底层fprintf()包装器的预处理器宏 产品需求变更现在要求两个承包商以有限的方式查看彼此的代码库 问题 在团队之间共享代码之前,必须从代码中清除单独签约团队使用的某些代码的日志语句,因为它可能包含我们未授权在团队之间共享的知识产权(即:解释某些模糊算法的工作原理) 问题 在Linux上(使用BASh、sed、VI

我有一个测试应用程序,它涉及来自几个独立承包商的库。每个承包商都编写了一个库,该库使用了我已经提供的通用日志API。在构建时,我可以传递一个完全优化日志调用的标志,因为它们是封装底层
fprintf()
包装器的预处理器宏

产品需求变更现在要求两个承包商以有限的方式查看彼此的代码库


问题 在团队之间共享代码之前,必须从代码中清除单独签约团队使用的某些代码的日志语句,因为它可能包含我们未授权在团队之间共享的知识产权(即:解释某些模糊算法的工作原理)


问题 在Linux上(使用
BASh
sed
VIM
awk
等),如何从源代码中删除某个函数的所有实例。一些样本:

logToClient("Something wrong with process %s (owner = %d).\n", 
    pName, iOwner);
 
logToClientVerbose("Big problem.");
我试着编写一个小python脚本来创建一个包含所有遇到的
字符的“堆栈”,但它不是100%都能工作的,我希望有一个简单的正则表达式单行程序魔法可以实现这一点


谢谢。

请考虑此测试文件:

$ cat file.c
logToClient2("keep this");
logToClient("Something wrong with process %s (owner = %d).\n", pName, iOwner);
logToClientVerbose("Big problem.");
logToClientVerb("Keep Verb.");
$ cat file2.c
logToClient2("keep this");
logToClient("Something wrong with process %s (owner = %d).\n", 
      pName, iOwner);
logToClientVerbose("Big problem.");
logToClientVerb("Keep Verb.");
要删除对要删除的两个函数的所有引用,请执行以下操作:

$ grep -vwE 'logToClient|logToClientVerbose' file.c
logToClient2("keep this");
logToClientVerb("Keep Verb.");
工作原理:

  • -v
    告诉grep删除匹配的行

  • -w
    告诉grep只匹配整个单词

  • -E
    告诉grep使用扩展正则表达式:这样我们就不必逃避
    |

  • logToClient | logtoclienterbose
    匹配
    logToClient
    logtoclienterbose

限制:这不会解析C。这只会删除具有匹配单词的行

命令分布在多行上
考虑以下测试文件:

$ cat file.c
logToClient2("keep this");
logToClient("Something wrong with process %s (owner = %d).\n", pName, iOwner);
logToClientVerbose("Big problem.");
logToClientVerb("Keep Verb.");
$ cat file2.c
logToClient2("keep this");
logToClient("Something wrong with process %s (owner = %d).\n", 
      pName, iOwner);
logToClientVerbose("Big problem.");
logToClientVerb("Keep Verb.");
此awk命令将文件分割为多个记录,这些记录由分号和换行符组成的记录分隔符进行标记。它将删除与
logToClient
logToClientVerbose
一词匹配的所有此类记录:

$ awk '!/\<(logToClient|logToClientVerbose)\>/' RS=';\n' ORS=';\n' file2.c
logToClient2("keep this");
logToClientVerb("Keep Verb.");
$awk'!/\/'RS='\n'ORS='\n'file2.c
LogtoClient 2(“保存此文件”);
logToClientVerb(“保留动词”);

限制:这不会解析C。这只会删除具有匹配单词的记录。例如,这会被一行上的多个命令或分号后带有空格的行所混淆。

函数可以像普通的
printf()
调用一样跨越多行。可能有一个代码“美化器”,您可以先运行代码,将所有多行标准化为单行。
在团队之间共享代码之前,必须从代码中清除单独签约团队使用的部分代码的日志语句。
IMHO其他代码将包含更深的秘密。@wildplasser在这种情况下并非如此。通过法律程序运行。代码只是一堆读/写操作代码。
。。。除了一堆读/写操作码之外,什么都没有……
日志函数调用也是如此。你只是想限制他们的产量?(->给每一方自己的日志调用)这(logToClientVerbose(“大问题”)、saveOuterFunction)@詹姆斯布朗:你认为这条线应该怎么做?为什么?效果很好。谢谢嗯,我曾考虑删除内部函数(使用magic:),但我想没有必要这样做。我可以使用
cpp
强制扩展所有日志记录语句以填充整行。配合您的解决方案,它就像一个魅力!