shell 使用sed命令解析资源Visual Studio .rc文件

jdzmm42g  于 2022-11-30  发布在  Shell
关注(0)|答案(2)|浏览(136)

我如何使用sed的pase .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中编写一个命令,以便获得此结果?
我编写了此命令,但这对我没有帮助

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

nr7wwzry1#

awk似乎比sed更适合这项任务:

awk '
    /^STRINGTABLE/ {
        in_block = 1
        print "std::map<int, std::string> m = {"
        next
    }
    in_block && /^END/ {
        in_block = 0
        print "};"
        next
    }
    in_block && match($0,/".*"/) {
        print "    {" $1 ", " substr($0,RSTART,RLENGTH) "},"
    }
' "$RC_FILE" > test_rc.h
vawmfj5a

vawmfj5a2#

这可能对你有用(GNU sed):

sed -En '/STRINGTABLE/{
         :a;N;/\nEND/!ba
         s/.*BEGIN(\s+)(\S+)\s+(\S+)(\s+)(\S+)\s+(\S+).*/std::map<int, std::string> m = {\1{\2, \3},\4{\5, \6},\n};/p
         }' file

收集STRINGTABLEEND之间的行,然后使用模式匹配和反向引用,根据需要格式化输出。

相关问题