2017-03-06 100 views
-1

我试图从gettext的创建ICU4C file的.po与sed这样的脚本文件:转换.po文件到ICU4C .txt文件

/^#/ 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。

+0

我相信''N'之后,你可能会在模式空间中有'quoteline \ nmsgid',只有'msgid'在模式空间的开头才会匹配'^'。它匹配'\ 0msgid'而不是'\ nmsgid' – stevesliva

回答

0

我已经通过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 

有可能是一个更好的方法,但它的工作。