加入收藏 | 设为首页 | 会员中心 | 我要投稿 我爱故事小小网_铜陵站长网 (http://www.0562zz.com/)- 视频终端、云渲染、应用安全、数据安全、安全管理!
当前位置: 首页 > 教程 > 正文

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在移到下一步前测试本步功能及结果很重要。如果不这样,可能会有一大堆包含怪异字符的意料外的结果。

(编辑:我爱故事小小网_铜陵站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读