(转发请保留这篇文章完整信息)
WindowsUnix文件格式之迷,空格与tab转换及其相关工具
来自:eybuild
eybuild@hotmail
关键词OS,Unix文件格式,空格与tab转换工具
fbinwin2unixtab2unix
摘要:这篇文章深入揭穿WindowsUnix格式区别,及因此而导至的各种问题.
一起介绍了一些与之相关的检测和操作工具,并在Windows,Unix进行举例.
1.问题提出:
我们可能会遇到过这样一些迷惑:
(1)如何检测一个文件或数据流的二进制格式(以十六进制格式显示)?
(2)为何在windows下编译的shell脚本在Unix下不能履行?
为何在windows下修改的C源文件在部分gcc编译器下不能编译?
(3)为何我在vi等编器下打开一个文这篇文章件会包括^M,如何把它去掉?
为何我在windows上用记事本打开unix上的文件,文件都不换行?
(4)如何删去文件行尾的空格或tab?
如何把文件中的tab转换成空格,或许把空格转换成tab?
如何只转换行首tab转换成空格?
...
2.分析与方案:
(1)如何检测一个文件的二进制格式(以十六进制格式显示)?
检测恣意文件或数据流的二进制格式,我们十分常用.
方法一:在UtraEdit使用Ctrl+H切换到十六进制修改方式.
注意
:
此方法一有缺陷,它会将行末的单个换行符显示成回车+换行两个字符.
这样会使问题(2)(3)(4)无法用此工具精确检测.
方法二:使用文件或流的二进制检测工具fbin
fbin可以运行于windows和各种Unix平台,
如下例的命令显示文件的前48字节:
$fbinxx.c0x30
filename:'xx.c'
filelen:0x68(104),offset:0x38,maxoutput:0x30
00000000:23696E636C7564653C737464696F2E68#include....intmain()..
00000020:7B0D0A20202020636861720920202020{..char.
fbin能精确显示文件中的每一个字节.(更多详细实例见后文)
(2)为何在windows下修改的shell脚本在Unix下不能履行?
为何在windows下修改的C源文件在部分gcc编译器下不能编译?
因素分析:
unix的shell脚本不能识别回车符(即:CR,'\r'),
Windows文件格式(详细分析见下文)换行时,老是以回车+换行
(可以借助上一问介绍的fbin工具,检测文件中是否包括回车换行对),
导到unix下的shell无法正常解说.
管理方法:
即是把windows格式的中的回车符删去,删去.
方法一:使用vi打开源文件,把'\r\n'替换成'\n'
缺陷
:不合适很多文件的批量办公.
方法二:使用UtraEdit把Windows格式的文件转换成Unix格式.
(菜单)文件--gt;转换--gt;Unix转DOS
缺陷
:不合适很多文件的批量办公.
方法三:Unix下的dos2unix命令,如$dos2unix-kxx.c
缺陷
:
此方法有一致命缺陷,它会改动本来的文件属性.
如一个可履行shell脚本的可履行属性及其它属性,转换后都将会扔掉
(即使用-k也仅仅能保留住本来的日期.)
长处
:合适很多通常文件这篇文章件的批量办公.
方法四:win2unix(windows,unix均可使用),功能相似dos2unix,
如win2unxxx.c(更多详细实例见后文)
长处
:
克服了dos2unix的一切缺陷(见上),它能保留源文件的任何属性.
还可以回来转换即unix2win
合适很多文件的批量办公.
(3)为何我在vi等编器下打开一个文这篇文章件会包括^M,如何把它去掉?(见定论4,5)
为何我在windows上用记事本打开unix上的文件,文件都不换行?(见定论1)
因素分析:
要管理这个问题,必先澄清unix与windows文这篇文章件的区别:
1)磁盘中Windows文这篇文章件老是以回车+换行的方式进行换行的.
2)磁盘中Unix格式的文这篇文章件,老是以换行符(即:LF,'\n')换行,而非回车换行符.
(Unix规则:unix文这篇文章件保留到磁盘时,老是自动把回车换行符转换成回车符保留,
输出到终端时由终端自动将将回车符转换成回车换行符输出.)
简单看出
:
Windows格式的文件换行时,老是比Unix格式的文件多一个回车('\r')符.
定论1
:
这样在windows的记事本中打开Unix格式的文件时,由于文件中没有'\r',所以无法正常显示.
成果就会把一切的内容显示在同一行中.
定论2
:
UtraEdit等工具会自动检测文件中是否包括'\r',当检测行末缺少'\r'时,通常它会提示
要求进行Unix到Windows格式的转换.(相信我们都遇到这个提示信息).
定论3
:
UtraEdit和vi等工具,在保留文件时会自动按照文件本来的格式进行保留.即:
如打开的如是windows格式它会把文件仍然按windows格式保留(不进行自动转换).
如打开的如是unix格式它会把文件仍然按unix格式保留(不进行自动转换).
定论4
:
向UtraEdit打开的Unix格式文件中,通过张贴板张贴Windows格式的若干片断行时
(或反之,即向Windows格式文件中,通过张贴板张贴Unix格式的若干片断行时),
代码片断中的回车换行符不会自动转换成单个换行符(反之亦然).
这样,该文件中就会出现回车符与回车换行符相互搀杂.
即,文件中既有独自的回车符也有成对的回车换行符.
定论5
:
vi修改器等,既能精确显示规则的Unix格式文件,也能精确显示规则的Windows格式文件,
但,对包括独自的回车符,一起成对的回车换行符的不规则文件(生成因素见定论4),
vi将把回车符以^M的方式显示.
管理方法:
使用相似问题2提供的管理方法即可管理,不再骜述.
将unix转换成Windows格式时,使用unix2dos或win2unix-r(-r代表反方向)即可.
(4)如何删去文件行尾的空格或tab?
如何把文件中的tab转换成空格,或许把空格转换成tab?
如何只转换行首tab转换成空格?
问题分析:
出于各种需求,特别是修改C/C++,Java等源程序时,常希望将源文件中的tab成空格,
或将空格转换成tab,一起删去行尾不必要的空格或tab等.
如果源程序的正文中字符串中包括空格或tab时,则只希望只转换行首的空格或tab.
管理方法:
如果是单个文件,直接使用一些修改器自带的转换功能转换.
如果是想批量转换,不防试试tab2s
voice\S2341.WAV
voice\ZR1030.WAV
voice\ZR1216.WAV
voice\ZR1682.WAV
voice\ZR579.WAV
voice\ZR815.WAV
voice\ZR900.WAV
voice\ZR924.WAV
fbin.exe
tab2sp.exe
win2unix.exe
.....
[下载]14592200042.rar
|