更改#include文件名以匹配大小写

时间:2012-11-07 21:18:09

标签: c++ c sed

我有一个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"

我想创建一个自动脚本来执行此更新。

我已经列出了以下步骤,这些步骤是这个过程的一部分,但我似乎无法将各个部分组合在一起。

  1. 创建所有* .h文件的列表,ls *.h > include.lst。这将创建一个包含正确大小写的所有文件名的文件。
  2. 使用include.lst中的文件名创建一个sed命令's/<filename>/<filename>/I',它执行不区分大小写的搜索并用正确的文件名替换匹配。我相信我只需要做一次替换,但添加全局g将会解决多次出现问题。
  3. 将此替换列表应用于目录中的所有文件。
  4. 我想建议如何创建给定include.lst的sed命令2)。我想我可以处理剩下的事了。

4 个答案:

答案 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)

  1. 在脚本中使用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文件中的所有标题包括更改为小写。

  2. 然后您想要更改所有文件名:

    find . -name *.h -print0 | xargs -0 rename 's/(*)/\L\1/'
    

    这会将所有头文件重命名为小写。

  3. 这仅适用于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

  1. ls *.h *.H创建一个文件列表,一次一行
  2. 将此列表导入sed。
  3. 搜索整行,即文件名。将整行放在第1组中。s/\(^\r\n]*\)/
  4. 用字符串s/\(\#include\s"\)<filename>"/\1<filename>"/gi
  5. 替换整行,文件名

    字符串#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