我更改了文件名,因此我必须更改包含的文件名。
例如,我将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来使其工作?
答案 0 :(得分:0)
find -name '*.h' -exec sed -i 's~alpha.h~fix_alpha.h~' {} \;
您的代码可能包含/
,因此请使用~
分隔符
答案 1 :(得分:0)
您的grep
命令会查找包含*
的文件(并且您的大多数C文件可能至少有一条注释,因此将选择所有C文件 - 源和标头)。不过,你可以做得更好。例如,假设需要映射的名称是alpha.h
,beta.h
,gamma.h
和delta.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_/'