自动修复C++代码库中的文件名情况

Automatically fix filename cases in C++ codebase?

本文关键字:文件名 情况 代码 C++      更新时间:2023-10-16

我正在将在Windows平台上开发的C++代码库移植到Linux/GCC。似乎作者不关心文件名的情况,所以他使用了

#include "somefile.h"

而不是

#include "SomeFile.h"

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

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

你应该能够用sed做到这一点:类似于sed -i 's/somefile.h/SomeFile.H/I' *.[Ch] 的东西

这意味着使用不区分大小写的somefile(尾随的/I),并用另一个文本SomeFile.H进行就地(同一文件)替换(-i)。

你甚至可以在一个循环中完成(完全未经测试):

for file in *.[Ch]
do
    sed -i "s/$file/$file/I" *.[Ch]
done

我应该注意的是,尽管我不认为这适用于您,但Solaris sed不支持-i,您必须安装GNU sed或重定向到文件并重命名。

原谅我,我现在不在linux环境中,所以我不能自己测试,但我可以告诉你需要使用什么实用程序来完成。

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

    cd ~/project

  2. 获取所需的所有.h文件的列表。您应该能够毫不费力地通过shell的通配符扩展来实现这一点。

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

  3. 获取整个项目中所有文件的列表(.c、.cpp、.h、.ness),任何可以#包括"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*#includes*")$h_escaped("s*$)" # I think this is right
    sed -i -e "s/$argument/$1$h$2/gip"` 
    

    是的,我知道它看起来很糟糕。

需要考虑的事项:

  • 与其直接在生产代码库上运行它,不如先对其进行彻底测试
  • sed可以吃掉文件,就像VCR可以吃掉磁带一样
  • 备份
  • 进行另一次备份
  • 这是一个涉及硬盘访问的O(N^2)操作,如果您的项目很大,它将运行缓慢。如果你的项目不是巨大的,不要麻烦,但如果是,可以考虑做一些事情将sed的输出管道传输到其他sed
  • 您的搜索应该不区分大小写:它应该匹配#include、#include、#include、现有标头文件名中存在的任何大小写组合,以及include和标头之间的任何空格量。如果保留空白,则可获得额外积分

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

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