我有一个C / C ++源代码体,其中#include语句中的文件名与* .h文件完全不匹配。匹配是正确的,但不区分大小写。这是Windows系统中出现的源文件类型。
我想更改所有源文件,以便所有#include
语句与它们引用的文件名完全匹配。
要更改的所有文件名都用引号括起来。
示例:
文件列表
File1.h
FILE2.H
file1.cpp
file1.cpp
#include "file1.h"
#include "file2.h"
将file1.cpp更改为
#include "File1.h"
#include "FILE2.H"
我想创建一个自动脚本来执行此更新。
我已经列出了以下步骤,这些步骤是这个过程的一部分,但我似乎无法将各个部分组合在一起。
ls *.h > include.lst
。这将创建一个包含正确大小写的所有文件名的文件。include.lst
中的文件名创建一个sed命令's/<filename>/<filename>/I'
,它执行不区分大小写的搜索并用正确的文件名替换匹配。我相信我只需要做一次替换,但添加全局g将会解决多次出现问题。我想建议如何创建给定include.lst
的sed命令2)。我想我可以处理剩下的事了。
答案 0 :(得分:2)
for hfile in $(find /header/dir -type f -iname '*.h'); do
sed -i 's/#include "'$hfile'"/#include "'$hfile'"/gI' file1.cpp
done
我希望我得到正确的引用:)在申请之前尝试不使用-i
。
您可以将sed
调用包装在另一个循环中,如下所示:
for hfile in $(find /header/dir -type f -iname '*.h'); do
for sfile in $(find /source/dir -type f -iname '*.cpp'); do
sed -i 's/#include "'$hfile'"/#include "'$hfile'"/gI' "$sfile"
done
done
答案 1 :(得分:2)
在脚本中使用sed
,或使用Perl脚本:
find . -name *.c -print0 | xargs -0 sed -i.bak -e "s/\#include\s\"\([^\"]+/)\"/\#include\s\"\L\1\"/"
-i.bak
会将文件备份到original_file_name.bak
,因此您无需担心是否陷入困境
此行将C文件中的所有标题包括更改为小写。
然后您想要更改所有文件名:
find . -name *.h -print0 | xargs -0 rename 's/(*)/\L\1/'
这会将所有头文件重命名为小写。
这仅适用于linux。如果您使用的是Windows,则可能需要使用Perl或Python脚本。
答案 2 :(得分:0)
这可能适合你(GNU sed):
sed 's|.*|s/^#include "&"$/#include "&"/i|' list_of_files | sed -i -f - *.{cpp,h}
答案 3 :(得分:0)
感谢有关小写文件名和#include字符串的所有详细信息。 但是,我最初的问题是要进行文字替代。
以下是符合我要求的基本命令和sed脚本。
ls *.h *.H | sed -e "s/\([^\r\n]*\)/s\/\\\(\\\#include\\\s\\\"\\\)\1\\\"\/\\\1\1\\\"\/gi/g" >> sedcmd.txt
ls *.h *.H
创建一个文件列表,一次一行s/\(^\r\n]*\)/
s/\(\#include\s"\)<filename>"/\1<filename>"/gi
字符串#include<space>"
放在第1组中。i
中的gi
表示不区分大小写的搜索。 g
是正常的全局搜索和替换。
给定文件名ACCESS.H和cancel.h,脚本的输出为
s/\(\#include\s"\)ACCESS.H"/\1ACCESS.H"/gi
s/\(\#include\s"\)cancel.h"/\1cancel.h"/gi
最后,sed命令文件可以与命令
一起使用sed -i.bak -f sedcmd.txt *.cpp *.h