Shell乱码文件中的控制字符处理
一、显示文件中的控制字符
当从其他系统下载文件时,有时要删除整个文件的控制字符(非打印字符),从菜单中捕获一个应用的屏幕输出有时也会将控制字符输出进文件,怎样知道文件中是否有控制字符?使用cat-vfilename命令,屏幕会乱叫,且到处都是一些垃圾字符,这可以确知文件中包含有控制字符,如果有兴趣可以观察一下这些字符以便于更加确认它们是控制字符。一些系统中使用catfilename而不是cat-v来查看非打印字符。
sed格式为:[address,[address]]l‘l’意为列表。
一般情况下要列出整个文件,而不是模式匹配行,因此使用l要从第一到最后一行。模式范围1,$即为此意。
如果cat一个文件,发现实际上包含有控制字符。
$cat –v a.txt This is the F1 key:^[OP This is the F2 key:^[OQ |
现在运行sed命令,观察输出结果。
$sed –n '1,$l' a.txt This is the F1 key:\033OP$ This is the F2 key:\033OQ$ $ |
sed找到并显示了两个控制字符。\033代表退格键,OP为F1键值,放在退格键后。第二行也是如此。各系统控制字符键值可能不同,主要取决于其映射方式(例如使用terminfo或termcap)。
如果要在文本文件中插入控制字符F1键,使用vi查看其键值,操作如下:
•启动vi。
•进入插入模式。
•按下<Ctrl>键,然后按<v>键(出现a^)。
•释放上述两个键。
•按下F1键(显示[OP]。
•按下<ESC>键(显示F1键值)。
二、处理控制字符
处理这样的控制字符有两种办法(但不一定满足所有情况,具体情况具体实现吧)。
第一种:直接执行dos2unixa.txt (这只可以处理dos到unix下的换行问题)
第二种:使用sed剔除控制字符。
下面是传送过来的文件(dos.txt)的部分脚本。必须去除所有可疑字符,以便于帐号所有者使用文件。
$ cat -v dos.txt 12332##DISO##45.12^M 00332##LPSO##23.14^M 01299##USPD##34.16^M |
可采取以下动作:
1)用一个空格替换所有的(##)符号。
2)删除起始域中最前面的0(00)。
3)删除行尾控制字符(^M)。
一些系统中,回车符为^@和^L,如果遇到一些怪异的字符,不必担心,只要是在行尾并且全都相同就可以。按步执行每一项任务,以保证在进行到下一任务前得到理想结果。使用输入文件dos.txt。
任务1。删除所有的#字符很容易,可以使用全局替换命令。这里用一个空格替换两个或更多的#符号。
$ sed 's/##*/ /g' dos.txt | cat -v 12332 DISO 45.12^M 00332 LPSO 23.14^M 01299 USPD 34.16^M |
任务2。删除所有行首的0。使用^符号表示模式从行首开始,^0*表示行首任意个0。模式s/^0*//g设置替换部分为空,即为删除模式,正是要求所在。
$ sed 's/^0*/ /g' dos.txt | cat -v 12332##DISO##45.12^M 332##LPSO##23.14^M 1299##USPD##34.16^M |
任务3。最后去除行尾^M符号,为此需做全局替换。设置替换部分为空。模式为:‘s/^m//g’,注意‘^M’,这是一个控制字符。要产生控制字符(^M),需遵从前面产生F1键同样的处理过程。步骤如下;键入seds/,然后按住<Ctrl>键和v键,释放v键,按<return>键。下面命令去除行尾^M字符。
$ sed 's/^M//g' dos.txt | cat -v 12332##DISO##45.12 00332##LPSO##23.14 01299##USPD##34.16 |
分步测试预想功能对理解整个过程很有帮助。用sed在移到下一步前测试本步功能及结果很重要。如果不这样,可能会有一大堆包含怪异字符的意料外的结果。