csatblogspotdotcom

Sunday, December 21, 2008

在vi中转换UNIX和DOS格式(行尾的^M)

刚才从Windows下把一个文件拷贝到Linux服务器下,然后又从服务器拷贝到另外一台Debian的机子上,打开后每行的行尾都多了一个“^M”。这次不同于以往情况:在vi中查看fileformat:set ff,确实是unix。
首先,Windows和Linux换行的区别:\r\n(< CR > < LF >)和\n(< LF >),从Windows拷贝到Linux时,\r被认为是一个单独的字符 ^M ( ^M这个字符用Ctrl+V后回车或者Ctrl+V后Ctrl+M可以输入),而从Linux到Windows,由于没有\r,\n就被认为是一个字符,在notepad中显示就是一个黑色的方块,而且整个文件很有可能只有一行。
接下来这里的情况,先从Windows拷贝到Linux上,估计系统认为是从Windows传过来的,于是认为是DOS格式(是根据文件从哪个系统传过来来判断文件格式,而不是文件本身的附加信息),于是可以正常显示;当从Linux又拷贝到另一台Linux(Debian)上时,估计是系统认为文件是从Linux传过来的,于是是unix格式,所以按unix格式文件来显示,这样把每行结尾的\r\n中的\n认为是换行符,而\r忽略了,导致\r被显示出来(^M),同时格式还被认为是unix格式。
这样的话,就不能用set ff=unix来解决了,只能用vi的s命令来解决。通过 %s/^M$// 或 %s/.$// 或 %s/\r$// 替换,其中%(或1,$)表示对整个文档所有的行进行替换,而.$或^M$中的$表示行尾(行首对应 ^ )。

p.s.
现在的vi命令基本上都是vim的一个软链接,而古老的vi在使用时,也常常会出现行尾^M的现象,个人认为这是由于vi不能识别DOS格式的文件造成的。

Labels: ,

0 Comments:

Post a Comment

Subscribe to Post Comments [Atom]

<< Home