Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1175728
  • 博文数量: 115
  • 博客积分: 950
  • 博客等级: 准尉
  • 技术积分: 1734
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-08 20:46
文章分类

全部博文(115)

文章存档

2015年(5)

2014年(28)

2013年(42)

2012年(40)

分类: LINUX

2012-05-16 18:14:06

Warning:本文为整理性文章,资料来源于网络

前世今生:

点击(此处)折叠或打开

  1. 在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。

  2. 于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。

  3. 这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。

  4. 后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。

  5. Unix系统里,每行结尾只有“ <换行> ”,即“\n”;
  6. Windows系统里面,每行结尾是“ <回车> <换行> ”,即“\r\n”;
  7. Mac系统里,每行结尾是“ <回车> ”。

  8. 一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。

回车:Carriage Return, 简称CR,   ASCII码为0xOD,     对应于\r
换行:Feedline,             简称LF,    ASCII码为0xOA,     对应于\n

有关于控制字符的功能和用法可以参考:
http://blog.chinaunix.net/link.php?url=http://bbs.chinaunix.net%2Fthread-3608423-1-1.html


使用od命令可以来查看文件的十六进制形式的值: od -t x1 file。

参考如下:http://www.cnblogs.com/faraway/archive/2009/03/05/1403649.html


对于在linux中取消掉文件test中的^M字符,可以有如下办法:
  • vim打开后使用替换命令"%s/\r\n/\r/g"
  • 使用tr命令"tr -d " test1  #如此除去test中的^M,然后把内容导入到test1中
  • dos2unix test dos #此命令没有尝试过,不确保正确性

其内容有参考:

http://www.52rd.com/blog/Detail_RD.Blog_imjacob_12317.html

但还有几点疑问:

  • 有关于控制字符的输入,在vim中尝试发现"^M"的输入需要分为两步,首先是Ctrl+v输入一个^, 然后Ctrl+M,如此方可。^@同理。
  • 在ubuntu中使用vim来实现输入\r时,按理应该是"Ctrl+v" + "Ctrl+J"。实际上如此后会产生一个^@,结果等同于"Ctrl+shift+2"。
  • 相同如果是windows中的\r\n结束的文档,在vim中会显示^M,然后使用“%s/\r\n/\n/g”后会出现意想不到的结果:没有换行符,所有的\r\n都被替换成了^@。但是使用“%s/\r\n/\r/g”却是正常显示
阅读(1286) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

abin96302013-10-30 16:19:52

同时在vim 中,使用 s 来进行替换时候:

在后面被替换时, \r 表示换行, \n 表示^@,也就是0x00字符。 具体原因不明。 Ref:  vim中诡异的^M  中的 第十九楼 
http://forum.ubuntu.org.cn/viewtopic.php?f=68&t=265457&sid=b562658ccae510333691f4fdd6541772&start=15

但是在%s 的前面或则使用 / 查找时候, \n, \r 的意义和上述文章中描写的一致

abin96302013-10-30 16:14:27

根据后续了解,看起来在vim中显示的 ^M 是单独的 \r 导致的,也就是0x0d

如果使用sed -i ’s/\r//g' file 就可以删除该符号