Shell乱码文件中的控制字符解决
发布时间:2021-12-16 16:20:01 所属栏目:教程 来源:互联网
导读:一、显示文件中的控制字符 当从其他系统下载文件时,有时要删除整个文件的控制字符(非打印字符),从菜单中捕获一个应用的屏幕输出有时也会将控制字符输出进文件,怎样知道文件中是否有控制字符?使用cat-vfilename命令,屏幕会乱叫,且到处都是一些垃圾字
一、显示文件中的控制字符 当从其他系统下载文件时,有时要删除整个文件的控制字符(非打印字符),从菜单中捕获一个应用的屏幕输出有时也会将控制字符输出进文件,怎样知道文件中是否有控制字符?使用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: 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.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在移到下一步前测试本步功能及结果很重要。如果不这样,可能会有一大堆包含怪异字符的意料外的结果。 (编辑:我爱故事小小网_铜陵站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |