Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / Shell乱码文件中的控制字符处理

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