如何用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
相关产品推荐
相关产品推荐

