2017-03-06 92 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 

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