Shell 乱码 文件中的控制字符处理

Shell乱码文件中的控制字符处理

author:润明2012-2-17QQ:226399587http://blog.csdn.net/runming918

一、显示文件中的控制字符

当从其他系统下载文件时,有时要删除整个文件的控制字符(非打印字符),从菜单中捕获一个应用的屏幕输出有时也会将控制字符输出进文件,怎样知道文件中是否有控制字符?使用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。

•进入插入模式。

•按下键,然后按键(出现a^)。

•释放上述两个键。

•按下F1键(显示[OP]。

•按下键(显示F1键值)。

二、处理控制字符

处理这样的控制字符有几种办法(但不一定满足所有情况,具体情况具体实现吧)。

方法一:直接执行 dos2unix a.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/,然后按住键和v键,释放v键,按键。下面命令去除行尾^M字符。

$  sed 's/^M//g' dos.txt | cat -v

12332##DISO##45.12

00332##LPSO##23.14

01299##USPD##34.16

分步测试预想功能对理解整个过程很有帮助。用sed在移到下一步前测试本步功能及结果很重要。如果不这样,可能会有一大堆包含怪异字符的意料外的结果。

方法三:使用sed剔除控制字符。

tr的第一个功能就是转换控制字符,特别是从dos向UNIX下载文件时,忘记设置ftp关于回

车换行转换的选项时更是如此。

下面是故意没有设置转换开关的一个文本文件,是关于文具需求的一部分内容。使用cat -v显示控制字符。

$  cat -v dos.txt

12332^^##DISO##45.12^M

00332^^##LPSO##23.14^M

01299^^##USPD##34.16^M

猜想^^^^^^是tab键。每一行以Ctrl -M结尾,文件结尾Ctrl -Z,以下是改动方法。

使用man ascii命令,查看ASCII表。^的八进制代码是136,^M是015,tab键是011,^Z是032 ,下面将按步骤完成最终功能。

$  tr -s "[^^]" "[\011*]" < dos.txt  | tr -s "[\015]" "[\012*]" | tr -s "[##]" " " | cat -v

12332    DISO 45.12

00332    LPSO 23.14

01299    USPD 34.16

 

 

你可能感兴趣的:(shell技巧篇)