You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用sed命令解析VS .rc文件提取STRINGTABLE并生成指定头文件

问题描述

需要用sed命令解析Visual Studio的.rc资源文件,提取其中的STRINGTABLE块内容,生成指定格式的str_file.h头文件。

输入的.rc文件STRINGTABLE块示例:

STRINGTABLE
BEGIN
    IDS_ID101    "String1"
    IDS_ID102    "String2"
END

期望生成的str_file.h内容:

std::map<int, std::string> m = {
    {IDS_ID101, "String1"},
    {IDS_ID102, "String2"},
};

尝试过的无效命令:

sed '/^BEGIN$/{N;N;s/BEGIN\(.*\)END/replaced \1/}/g' ${RC_FILE} > test_rc.h

正确的sed命令

以下sed命令可以实现需求:

sed -n '/^STRINGTABLE$/,/^END$/{
    /^STRINGTABLE$/d
    /^BEGIN$/d
    /^END$/{
        print "};"
        d
    }
    s/^\s*\(\w*\)\s*\("\w*"\)/    {\1, \2},/
    /^\s*$/d
    1i std::map<int, std::string> m = {
}' ${RC_FILE} > str_file.h

命令说明:

  • -n:仅输出经过处理的行,默认不打印所有行
  • /^STRINGTABLE$/,/^END$/:只处理从STRINGTABLE开头行到END开头行的内容块
  • /^STRINGTABLE$/d、/^BEGIN$/d:删除块内的STRINGTABLE和BEGIN行,这两行不需要保留
  • /^END$/分支:遇到END行时,输出map的结束语句};,并删除原END行
  • s/^\s*\(\w*\)\s*\("\w*"\)/ {\1, \2},/:匹配每行的ID和字符串,转换成map元素的格式,保留适当缩进
  • /^\s*$/d:删除块内的空行,避免生成多余的空行
  • 1i std::map<int, std::string> m = {:在处理的第一行有效内容前,插入map的初始化开头

内容的提问来源于stack exchange,提问作者AlexZel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 20:10:31