关于DOS文件转换成UNIX文件格式

dos格式文件传输到unix系统时,会在每行的结尾多一个互动消息统计^M,当然也有可能看不到,但是在vi的时候,会在下面显示此文件的格式,比如“dos.txt” [dos] 120L,2532C字样,表示是一个[dos]格式文件,如果是MAC系统的,会显示[MAC],因为文件格式的原因有时会导致我们的unix程序,或者shell程序出现错误,那么需要把这些dos文件格式转换成unix格式,方法是
vi dos.txt
:set filefotmat=? #查看文件格式
:set fileformat=unix #转换成unix格式
:w #保存更改
这样文件就转换成unix格式文件了, 一般在windows机器上编写好了文件传到unix下就可能会出现这样的情况。

也可以用以下命令查看文件格式:
:set ff?   #查看文件格式dos或unix的字样.
:set ff=unix #强制转换为unix格式

如果以上步骤要求在一个shell批处理文件中完成,可以如下这样写:
vi +’:w ++ff=unix’ +’:q’ dos.txt
vi +’:w ++ff=unix’ +’:q’ user.txt
这样一条命令就可以搞定了,但是要严格注意上面空格的位置,不能多不能少。

也可以用sed 这样的工具来做(其中^M是同时Ctrl+V+M按出来的,表示回车):
sed ‘s/^M//’ dos.txt > tmp_filename

有时用vi打开文件会显示如下信息:
“user.txt” [noeol][dos] 240L, 6407C
直观上理解,’noeol’ 就是 ‘no end-of-line’, 即“没有行末结束符”,linux下的文本编辑器(如vim)会在每行(包括最后一行)末尾添加一个换行符。
使用cat -A user.txt命令可以看到这些换行符:
salley$
fang$
从中可以清楚的看到每行末尾的’$’字符,这就是linux下的‘行末结束符’。

在windows下创建的文件,在linux上查看,内容显示如下:
[root@locahost tmp]# cat -A salley.txt
salley^M$
fang[root@localhost tmp]#
同样的,每行一个单词,windows和linux下换行符有两个明显不同,windows下的换行符比linux下多了个‘^M’;
最后一行行末没有换行符;

发现windows下创建的salley.txt文件用vim打开有两个标识[noeol][dos]
Windows 下文本文件每行的换行符为“回车+换行“(CRLF,^M$), 而 Linux 下则仅为 “换行” (LF, $). Vim 发现文本中含有 ^m$换行字符判定为 Windows 下创建的 文件,用 [dos] Flag 提示;Vim 没有在最后一行发现换行符,判定此文件不是在 Linux 下创建/编辑,用 [noeol] Flag 提示用户。

如何消除 [noeol] Flag 信息?
只需在linux下将该文件重新保存即可,还是上面的 salley.txt 文件,打开它, 不做任何修改直接 :wq保存退出,再查看换行符:
[root@localhost tmp]# cat -A salley.txt
salley^M$
fang^M$
[root@localhost tmp]#
换行符已经追加上去,这里要注意的是追加的是 Windows 下的换行符(回车+换行)^M$, 而不是 Linux 下的换行符(换行)$, 因为 Vim 已经发现此文件 是在 Windows 下创建的([dos] Flag),尽管是在 Linux 下编辑,Vim 也会按照文件创建 时所在的操作系统下的换行规则添加换行符。

如何消除 [dos] Flag 信息?
有两种简单的方法:
Linux下提供有两个命令用来进行 Windows 和 Unix 文件的转化:dos2unix 和 unix2dos,也可以使用上面讲到的vim或者sed命令来强制转换文件编码格式
在linux下使用touch template.txt创建一个模板,在 Windows 下创建的任 何文本文件都以此模板为基础;

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注