Как я могу использовать 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
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
Это может сработать для вас (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
Соберите строки между STRINGTABLE
и END
, а затем, используя сопоставление с образцом и обратные ссылки, отформатируйте вывод по мере необходимости.