使用正则表达式更改包含头文件

时间:2015-09-22 02:18:32

标签: regex sed

我更改了文件名,因此我必须更改包含的文件名。 例如,我将alpha.h更改为fix_alpha.h。所以我必须改变 #include "alpha.h"#include "fix_alpha.h" 但有很多文件要修复像beta.h到fix_beta.h 我尝试使用reg exp来修复它

grep -rl '*' ./ | xargs sed -i 's/*\.h``/fix_*\.h/g'

但它不起作用。 我应该如何使用reg exp来使其工作?

3 个答案:

答案 0 :(得分:0)

find -name '*.h' -exec sed -i 's~alpha.h~fix_alpha.h~' {} \;

您的代码可能包含/,因此请使用~分隔符

答案 1 :(得分:0)

您的grep命令会查找包含*的文件(并且您的大多数C文件可能至少有一条注释,因此将选择所有C文件 - 源和标头)。不过,你可以做得更好。例如,假设需要映射的名称是alpha.hbeta.hgamma.hdelta.h,并且您是一名经常理智的程序员,他们不会t在文件名或目录名中放置空格或换行符,然后您可以使用以下命令生成有趣文件列表:

grep -rlE '^#include[[:space:]]*"(alpha|beta|gamma|delta)\.h"' .

然后,对于每个此类文件,您需要使用fix_前缀替换这些标头名称。现在,您可以了解sed是否已扩展正则表达式。假设没有,那么您可以创建一个sed脚本来为您进行映射。例如,创建一个包含以下内容的文本文件mapped-headers

alpha.h
beta.h
gamma.h
delta.h

现在将其转换为sed脚本(当然)sed

sed -e 's/\.h/\\.h/' \
    -e 's%.*%s/^#include[[:space:]]*"&"/#include "fix_&"/' \
    mapped-headers > script.sed

现在,您可以将该脚本应用于包含要使用的任何标头的文件:

grep -rlE '^#include[[:space:]]*"(alpha|beta|gamma|delta)\.h"' . |
xargs sed -i.bak -f script.sed

(如果您使用-i选项覆盖Mac OS X上的文件,则必须提供备份后缀,该后缀可以附加到-i选项,如图所示,也可以单独选项;如果你不想要后缀而是覆盖,你必须在Mac上写-i ''。相反,如果你使用的是GNU sed,备份后缀是可选的,但如果存在,则必须附加-i选项。显示的内容适用于两个平台。并非sed的所有版本都支持覆盖-i选项。)

对于带有简单前缀映射的100个标头的扩展应该是显而易见的,至少对于sed脚本部分而言。您也可以使用sed脚本生成grep脚本;它在精神上会相似,但比所示的更简单。

您可以编写更高级的正则表达式来匹配#include指令的异常布局。您可以在#之前和#之后留出空格。如果您在#include行的操作部分中有注释,那么您遇到的问题不仅仅是映射名称。此代码无法处理:

/* comments? */    #    \
include /*
    */   "alpha.h"

但是,没有人能够理智地写出这样的代码。

此外,如果你有一些不完全系统的重命名,你可以通过更改mapped-headers文件来修改脚本来处理它,以便在单独的列中包含'old'和'new'值:

alpha.h    alphabet.h
beta.h     veg/carotene.h
gamma.h    hard/radiation.h
delta.h    v-wing.h

答案 2 :(得分:0)

保持简单:

find . -type f -print | xargs sed -i 's/#include "/&fix_/'