您的位置:首页 > 运维架构 > Shell

Shell 脚本的小实战

2016-04-19 15:57 453 查看

Shell 脚本的小实战

这件事要说,还要从放寒假后没几天说起,那个时候邓老师的数据结构MOOC要在Edx上线,招字幕翻译支援者。在下虽然是个英语渣渣,但舍不得放弃这次学习机会。然后想想,虽然在下英语烂,但是在下身边有英语好的人呀,这样的刷经验的机会如果放过了实在可惜。

所谓冲动是魔鬼,我一激动,就报名了,联系了一位英语较好的同学为我审稿,然后也通过了试翻译的片段。我翻译的章节是最后一章12章。

一开始我是直接讲翻译好的稿子去掉中文部分发给同学的,后来为了方便她看选择了保留中文部分。她发回来给我的文章也是包含中文部分的。

作为一个拖延症晚期患者,中文部分我都是留着的,准备最后再删除。

然后,这个最后的时刻终于到来了。



打开来以后是这样的,上面的乱码是中文部分,我用字幕软件gnome-subtitles打开是没有乱码的。



一篇一篇删除,应该也不会太麻烦,可是会很累啊。

听说Linux下Shell编程很是强大,不如我们试一下把。

限于本人水平,下面的方法可能会比较蠢,欢迎吐槽。

1.一个C语言的删除中文的小程序

根据我的观察,全英文的那行,除了我手残输入一些中文的标点符号,其他的都应该是ASCII码的字符。而乱码部分也就是中文部分,基本没有ASCII编码的字符。

所以程序如下:

const int size = 1000;
int main()
{
std::ios::sync_with_stdio(false);cin.tie(0);
int i,j;
char str[size];
while (cin.getline(str,size,'\n')){
int cnt1 = 0,cnt2 = 0;
for (i=0;str[i]!='\0';i++){
if (str[i]>0&&str[i]<128)
cnt2++;
else
cnt1++;
}
if (cnt1<cnt2)
cout << str << endl;
}
return 0;
}

就是上面这个样子啦

处理后的对比图



2.一个遍历srt文件,将他们使用上述程序处理,重定向至另一个文件夹的Shell脚本

#!bin/sh
for file in ./*.srt
do
~/tmp < $file
~/tmp < $file >~/Desktop/testout/$(basename $file)
done
就算不会写,也应该能看懂才是,上述转换程序编译后名字是tmp,第一行仅输入重定向,将输出写到屏幕上,方便我检查程序运行的结果。后一行我讲输出结果送到桌面下的testout文件夹中,并以相同名字命名,basename命令负责提取处文件去掉路径之后的名称。

3.结尾的小插曲

因为经常和审稿的那位同学在linux和windows下不停的转换,我也学会了将文件的编码在UTF-8和GBK之间互相转换,并不知道接受者使用的是哪种编码,但是作为一个负责人的人,我应该把任务完成的漂漂亮亮。因此最后将GBK和UTF-8两种格式的字幕都发过去吧。

#!bin/sh
for file in ./*.srt
do
iconv $file -c -f UTF-8 -t GBK -o ~/Desktop/12-GBK/$(basename $file)
echo  $file
done
转换编码,我使用的是linux自带的iconv工具。
然后,打包发给负责人,我的任务就这样完成啦。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: