Bash:用翻译替换特定文本

Bash: replace specific text with its translation

有一个大文件,我想用它的翻译替换'='和'\n'之间的所有文本,这是一个例子:

input:

screen.LIGHT_COLOR=Lighting Color 
screen.LIGHT_M=Light (Morning)
screen.AMBIENT_M=Ambient (Morning)

output:

screen.LIGHT_COLOR=Цвет Освещения
screen.LIGHT_M=Свет (Утро)
screen.AMBIENT_M=Эмбиент (Утро)

到目前为止,我所做的只是提取和翻译目标文本。

while IFS= read -r line
do
        echo $line | cut -d= -f2- | trans -b en:ru

done < file.txt

output:
    Цвет Освещения
    Свет (Утро)
    Эмбиент (Утро)

*trans 是 translate-shell 的缩写。它很慢,但可以完成工作。 -b 用于简短翻译; en:ru 表示英语到俄语。

如果您有任何建议或解决方案,我将很高兴知道,谢谢!

编辑,以防有人需要:

在发现反式shell 限制后,我最终接受了 @TaylorG. 的建议。 translation-shell 是 seams,每次允许大约 110 个请求。单独处理每一行会导致 1300 个请求,这会破坏脚本。

长话短说,将所有数据打包到一个请求中会更快。可以将处理时间从几分钟减少到几秒钟。抱歉代码乱七八糟,这是我的第三天:

cut -s -d = -f 1 en_US.lang > option_en.txt
cut -s -d = -f 2 en_US.lang > value_en.txt

# merge lines
sed ':a; N; $!ba; s/\n/ :: /g' value_en.txt > value_en_block.txt

trans -b en:ru -i value_en_block.txt -o value_ru_block.txt

sed 's/ :: /\n/g' value_ru_block.txt > value_ru.txt

paste -d = option_en.txt value_ru.txt > ru_RU.lang

# remove trmporary files
rm option_en.txt value_en.txt value_en_block.txt value_ru.txt value_ru_block.txt

感谢 Taylor G.、Armali 和每一位评论员

在大循环中使用管道是昂贵的。您可以尝试以下方法。

cut -s -d = -f 1 file.txt > name.txt
cut -s -d = -f 2- file.txt | trans -b en:ru > translate.txt
paste -d = name.txt translate.txt

它将比您当前的脚本快得多。我不确定您的 trans 方法是如何编写的。如果不是,则需要对其进行更新以处理批处理输入,例如使用 while 循环。

trans() {
    while read -r line; do
        # do translate and print result
    done
}

您已经完成了大部分工作,但还可以进行一些优化。缺少的只是输出行的第一部分直到等号连同翻译:

while IFS== read left right
do  echo $left=`trans -b en:ru <<<$right`
done <file.txt