其他信息

换行符

不同操作系统上的换行符不同, 包括以下三种:

  • CR(CarriageReturn) 回车
  • LF(LineFeed) 换行
  • CRLF

其中:

Dos和Windows CR/LF
UNIX/Linux LF
MAC OS系统 CR

区别

CR与LF区别如下:

  • CR用符号r表示,十进制ASCII代码是13,十六进制代码为0x0D
  • LF使用n符号表示,ASCII代码是10,十六制为0x0A

所以Windows平台上换行在文本文件中是使用0d 0a两个字节表示,即 \r\n;而UNIX和苹果平台上换行则是使用0a或0d一个字节表示, 即 \n;

注意

Windows上的文本, 如果不经过转换, 在LINUX上会显示为 ^M + \n.

自动转换

一般操作系统上的运行库会自动决定文本文件的换行格式。如一个程序在Windows上运行就生成CR/LF换行格式的文本文件,而在Linux上运行就生成LF格式换行的文本文件。 在一个平台上使用另一种换行符的文件文件可能会带来意想不到的问题,特别是在编辑程序代码时。 有时候代码在编辑器中显示正常,但在编辑时却会因为换行符问题而出错。 很多文本/代码编辑器带有换行符转换功能,使用这个功能可以将文本文件中的换行符在不同格式单互换。

在不同平台间使用FTP软件传送文件时,在ASCII文本模式传输模式下,一些FTP客户端程序会自动对换行格式进行转换。 经过这种传输的文件字节数可能会发生变化。如果你不想FTP修改原文件,可以使用bin模式(二进制模式)传输文本。

手动转换

Windows

在Windows环境下,用ultraedit或者notepad plus都有相应的选项可以将Windows下的文本格式文件转换成unix格式文件。 比如:notepad plus中“编辑”—>“档案格式转换”—>“转换为UNIX格式”。

Linux

在Linux下面,一般有三种方式来转换文件:

  1. 使用dos2unix工具, 该命令会去掉行尾的^M。
$ dos2unix myfile.txt
  1. 用vi修改文件

两种情况:

  • 如果文件是在windows环境下创建并编辑的,文件中所有的换行符都是 \r\n ,vi会在打开文件时识别出该文件是dos格式,此时不会显示 ^M ,在命令行模式下输入 :set fileformat=unix ,然后保存即可。
  • 如果文件中的换行符有些是为 \r\n ,有些是 \n ,在vi显示文件时,为 \r\n 将会显示为 ^M 然后换行。这种情况可以直接用vi的替换功能。

vi 替换命令:

替换所有的 ^M

:%s/^M//g

替换行尾的 ^M

:%s/^M$//g

^M 替换成回车:

:%s/^M/[ctrl-v]+[enter]/g

^M 替换成回车:

:%s/^M/\r/g

提示

在命令中, ^M 的输入方式是 Ctrl+vCtrl+m ,是一个字符,不是两个字符。( ^I 制表符也是如此。)

如果碰到有提示:E486: Pattern not found: ^M,单文件中实际存在 ^M ,比如用 cat -vcat -A 查看时, 这种情况应该是因为文本中每行都是 \r\n 结尾,vi自动用dos模式打开,这样就看不到 ^M ,这时候直接用 :set fileformat=unix 就可以了。

  1. 使用 sed 命令修改
$ sed -e 's/^M/\n/g' myfile.txt

注意

^M = Ctrl+v,Ctrl+m