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
有一个大文件,我想用它的翻译替换'='和'\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