自动修复C++代码库中的文件名情况
Automatically fix filename cases in C++ codebase?
我正在将在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环境中,所以我不能自己测试,但我可以告诉你需要使用什么实用程序来完成。
-
打开终端并使用
cd
导航到正确的目录。cd ~/project
-
获取所需的所有.h文件的列表。您应该能够毫不费力地通过shell的通配符扩展来实现这一点。
ls include/*.h libs/include/*.h
-
获取整个项目中所有文件的列表(.c、.cpp、.h、.ness),任何可以#包括"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*#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"替换为"。
- 从命令行c++发送文本文件名
- 在没有太多条件句的情况下,我如何避免被零除
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 函数中堆分配的效果与缺少堆分配的情况
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 在未初始化映射的情况下,将值插入到映射的映射中
- 是默认情况下分配给char数组常量的值
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在已经使用Git的情况下减少编译时间
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 如何在没有信号的情况下从C++执行QML插槽
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 自动修复C++代码库中的文件名情况
- 为什么c_str在这种打开(文件名)的情况下不起作用
- 如何在没有波浪号替换的情况下获取真实文件名
- 无法在不搞砸程序的情况下更改文件名
- 有没有一种方法可以在不引起竞争的情况下检查重复的文件夹/文件名
- 在没有指定路径或文件名的情况下打开文件