Sed 将.po文件转换为ICU4C.txt文件
我尝试使用Sed 将.po文件转换为ICU4C.txt文件,sed,localization,gettext,data-conversion,icu,Sed,Localization,Gettext,Data Conversion,Icu,我尝试使用sed脚本从gettext.po文件创建一个脚本,如下所示: /^#/ d /* delete comments */ :a;/"$/{N;s/"\n"//;ba} /* merge quoted lines in loop */ /^msgid /s/msgid (.*)/\1/ /* convert msgids */ s/msgstr "(.*)"/\{ "\1" }/ /*
sed
脚本从gettext.po文件创建一个脚本,如下所示:
/^#/ d /* delete comments */
:a;/"$/{N;s/"\n"//;ba} /* merge quoted lines in loop */
/^msgid /s/msgid (.*)/\1/ /* convert msgids */
s/msgstr "(.*)"/\{ "\1" }/ /* convert msgstrs */
它已经很好地工作了(忽略复数形式),但出于某种原因,它不会转换最后一对msgid/msgstr,除非我不合并引号两次。但是其他东西的语法就错了。有什么想法吗?不必使用sed
这些ICU文件是genrb唯一接受的文件,我想在PHP中使用ResourceBundle。我通过一个shell脚本实现了我的目标。以下是大概的想法:
#!/usr/bin/env bash
# remove comments
sed -r -e '/^#/ d' < de.po >de.icu.txt
# merge strings
sed -i de.icu.txt -r -e ':L;/"$/{N;s/"\n"//;b L}'
# delete gettext header
sed -i -e '1,2 d' de.icu.txt
# convert into ICU format
sed -i de.icu.txt -r -e '
# delete untranslated
/msgid ".+"/{
N
/msgstr ""/{
N;s/msgid ".+"\nmsgstr ""\n//
}
}
# generate ICU txt
/msgid /s/msgid (.*)/\1/
s/msgstr "(.*)"/\{ "\1" }/'
sed -i -e '1i de {' -e '$ a\\n}' de.icu.txt
#/usr/bin/env bash
#删除评论
sed-r-e'/^#/d'de.icu.txt
#合并字符串
sed-ide.icu.txt-r-e':L/“$/{N;s/”\N//;bl}”
#删除gettext头
sed-i-e'1,2 d'de.icu.txt
#转换成ICU格式
sed-i de.icu.txt-r-e'
#删除未翻译的
/msgid“+”/{
N
/msgstr“”/{
N、 s/msgid“+”\nmsgstr”“\N//
}
}
#生成ICU文本
/msgid/s/msgid(.*)/\1/
s/msgstr“(.*)”/\{“\1”}/'
sed-i-e'1i de{'-e'$a\\n}'de.icu.txt
可能有一种更好的方法,但它确实起到了作用。我相信在
N
之后,模式空间中可能会出现quoteline”\nmsgid
,只有msgid
位于模式空间的开头时,^
才会匹配。它与\0msgid
不匹配\nmsgid