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