【问题标题】:Bash: replace specific text with its translationBash:用翻译替换特定文本
【发布时间】:2021-04-21 20:09:00
【问题描述】:

有一个巨大的文件,我想用它的翻译替换所有在 '=' 和 '\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 表示英语到俄语。

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

编辑,以防有人需要:

在发现 trans-shell 限制后,我最终接受了 @TaylorG. 的建议。翻译壳每次允许大约 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 和每一位评论员

【问题讨论】:

    标签: bash file translation


    【解决方案1】:

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

    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
    }
    

    【讨论】:

    • 我相信他们的trans来自github.com/soimort/translate-shell
    • 如果有任何行没有=,您的脚本可能会失败
    • 感谢@jhnc 指出这一点。我将-s 标志添加到cut 以抑制没有= 的行。
    • @TaylorG.: 或者根据你的想法和bash:paste -d '=' &lt;(cut -s -d = -f 1 file.txt) &lt;(cut -s -d = -f 2- file.txt | trans -b en:ru)
    【解决方案2】:

    您已经完成了大部分工作,尽管还可以进行一些优化。缺少的只是将行的第一部分与等号一起输出:

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

    【讨论】:

    • 引用这个论点可能更安全:echo "..."
    • 也许吧,但我宁愿只在看到需要时才引用,否则当我真的必须引用时,我永远学不会。在手头的情况下,= 右侧的 echo 参数部分显然不需要进一步引用; $left 可能需要它,但它是一种我认为不能包含特殊字符的标识符。
    猜你喜欢
    • 2012-08-10
    • 1970-01-01
    • 2012-02-07
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多