1

我正在将在 Windows 平台上开发的 C++ 代码库移植到 Linux/GCC。看来作者不关心文件名的大小写,所以他用

#include "somefile.h"

代替

#include "SomeFile.h"

包括实际上称为“SomeFile.h”的文件。我想知道是否有任何工具可以自动修复这些包含?这些文件都在一个目录中,因此该工具很容易找到正确的名称。

4

3 回答 3

3

编辑:在做任何事情之前请注意,我假设您要么有文件的副本,要么最好在源代码管理中拥有基线版本,如果您出于任何原因需要回滚。

你应该能够做到这一点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 或重定向到文件并重命名。

于 2012-07-31T15:39:57.860 回答
1

原谅我,我现在远离我的 linux 环境,所以我不能自己测试这个,但我可以告诉你你需要使用哪些实用程序来完成它。

  1. 打开终端并使用cd导航到正确的目录。

    cd ~/project

  2. 获取您需要的所有 .h 文件的列表。您应该能够毫不费力地通过 shell 的通配符扩展来完成此操作。

    ls include/*.h libs/include/*.h

  3. 获取整个项目中所有文件的列表(.c、.cpp、.h、.whatever),任何可以#include“header.h”的文件。再次,通配符扩展。

    ls include/*.h libs/include/*.h *.cpp libs/*.cpp

  4. 使用 for 循环遍历项目中的每个文件

    for f in ... # wildcard file list
    do
        echo "Looking in $f"
    done
    
  5. 使用 for 循环遍历每个头文件

    for h in ... # wildcard header list
    do
        echo "Looking for $h"
    done
    
  6. 对于每个项目文件中的每个标头,使用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可以像录像机一样吃文件可以吃磁带。
  • 做好备份。
  • 做另一个备份。
  • 这是一个涉及硬盘访问的 O(N^2) 操作,如果您的项目很大,它将运行缓慢。如果您的项目不是很大,请不要打扰,但如果是,请考虑做一些事情来将seds 的输出传递给其他seds。
  • 您的搜索应该不区分大小写:它应该匹配 #include、#INCLUDE、#iNcLuDe 以及现有头文件名中存在的任何大小写组合,以及包含和头之间的任何数量的空格。如果您保留空格,则可以加分。
于 2012-07-31T16:40:01.357 回答
0

使用 Notepad++ 执行“在文件中查找”并替换。

从工具栏:搜索 - 在文件中查找。然后完成“查找内容”和“替换为”。

于 2012-07-31T15:36:05.593 回答