下面是一个 C++ 包含保护的错字。两者都应该阅读_MYFILE_H_
。
#ifndef _MYFILE_H_
#define _MYFLIE_H_
您如何建议使用 GNU coreutils(例如 grep、awk)在一堆头文件中搜索这样的错字?
下面是一个 C++ 包含保护的错字。两者都应该阅读_MYFILE_H_
。
#ifndef _MYFILE_H_
#define _MYFLIE_H_
您如何建议使用 GNU coreutils(例如 grep、awk)在一堆头文件中搜索这样的错字?
你可以使用awk
:
{
if ($1 == "#ifndef") { was_ifdef = 1; def = $2 }
else if ($1 == "#define" && was_ifdef)
{
if ($2 != def) printf("Mismatch in %s: expected %s found %s\n", FILENAME, def, $2);
}
else was_ifdef = 0;
}
可能有更聪明的方法可以做到这一点,但这(对我来说)非常清楚和容易。
注意:如果文件包含类似的内容,这将显示“误报”
#ifndef FOO_DEFINED
typedef int foo;
#define FOO_DEFINED
#endif
grep
本身在这里不起作用,因为正则表达式的功能不足以匹配您描述的字符串集。
具体来说,表单的所有字符串的语言
#ifndef X
#define Y
其中X
≠Y
不是常规语言。您可以通过使用 Myhill-Nerode 定理来证明这一点(因为#ifndef X
用于不同选择的任何两个形式的字符串都X
属于可区分关系的不同等价类)。结果,没有办法写出可以匹配这种形式的字符串的正则表达式,而且由于grep
使用的是纯数学正则表达式,所以没有办法用它grep
来解决这个问题。
抱歉,结果为阴性,但我希望这会有所帮助!
多个 sed 命令可以解决问题。
for FILENAME in ./*.h; do
[[ $(sed -n '1p' "$FILENAME" | sed -e 's/#ifndef //') != $(sed -n '2p' "$FILENAME" | sed -e 's/#define //') ]] && echo "$FILENAME"
end
该实现的问题在于,防护上方可能没有版权标头。
而且我很确定这可以写得更简洁。