我正在将在 Windows 平台上开发的 C++ 代码库移植到 Linux/GCC。看来作者不关心文件名的大小写,所以他用
#include "somefile.h"
代替
#include "SomeFile.h"
包括实际上称为“SomeFile.h”的文件。我想知道是否有任何工具可以自动修复这些包含?这些文件都在一个目录中,因此该工具很容易找到正确的名称。
我正在将在 Windows 平台上开发的 C++ 代码库移植到 Linux/GCC。看来作者不关心文件名的大小写,所以他用
#include "somefile.h"
代替
#include "SomeFile.h"
包括实际上称为“SomeFile.h”的文件。我想知道是否有任何工具可以自动修复这些包含?这些文件都在一个目录中,因此该工具很容易找到正确的名称。
编辑:在做任何事情之前请注意,我假设您要么有文件的副本,要么最好在源代码管理中拥有基线版本,如果您出于任何原因需要回滚。
你应该能够做到这一点sed
:像sed -i 's/somefile\.h/SomeFile.H/I' *.[Ch]
这意味着采用不区分大小写somefile
(尾随/I
)并-i
使用其他文本SomeFile.H
.
您甚至可以循环执行(完全未经测试):
for file in *.[Ch]
do
sed -i "s/$file/$file/I" *.[Ch]
done
我应该注意,虽然我不相信这适用于您,但 Solarissed
不支持-i
,您必须安装 GNU sed 或重定向到文件并重命名。
原谅我,我现在远离我的 linux 环境,所以我不能自己测试这个,但我可以告诉你你需要使用哪些实用程序来完成它。
打开终端并使用cd
导航到正确的目录。
cd ~/project
获取您需要的所有 .h 文件的列表。您应该能够毫不费力地通过 shell 的通配符扩展来完成此操作。
ls include/*.h libs/include/*.h
获取整个项目中所有文件的列表(.c、.cpp、.h、.whatever),任何可以#include“header.h”的文件。再次,通配符扩展。
ls include/*.h libs/include/*.h *.cpp libs/*.cpp
使用 for 循环遍历项目中的每个文件
for f in ... # wildcard file list
do
echo "Looking in $f"
done
使用 for 循环遍历每个头文件
for h in ... # wildcard header list
do
echo "Looking for $h"
done
对于每个项目文件中的每个标头,使用sed
搜索#include "headerfilename.h"
,并替换为#include "HeaderFileName.h"
或任何正确的大小写。
警告:未经测试,可能很危险: 这个东西是一个开始的地方,在使用前应该彻底测试。
h_escaped=$(echo $h | sed -e 's/\([[\/.*]\|\]\)/\\&/g') # escapes characters in file name
argument="(^\s*\#include\s*\")$h_escaped(\"\s*\$)" # I think this is right
sed -i -e "s/$argument/\$1$h\$2/gip"`
是的,我知道它看起来很糟糕。
需要考虑的事项:
sed
可以像录像机一样吃文件可以吃磁带。sed
s 的输出传递给其他sed
s。使用 Notepad++ 执行“在文件中查找”并替换。
从工具栏:搜索 - 在文件中查找。然后完成“查找内容”和“替换为”。