Linux和Windows的换行符
一直对换行符这个东西概念比较模糊,直到最近花了一点时间仔细研究了一下,才彻底搞清楚这个问题,本文前面介绍部分是外文转载,后面例子是个人总结,希望能对大家有一些帮助。
回车符号和换行符号产生背景
关于“回车”(carriage return)和“换行”(line feed)这两个概念的来历和区别。
在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。
于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。
Unix 系统里,每行结尾只有“<换行>”,即“n”,十六进制数值是:0A;
Windows系统里面,每行结尾是“ <回车><换行>”,即“ rn”,十六进制数值是:0D0A;
Mac系统里,每行结尾是“<回车>”。即“r”,十六进制数值是:0D;
一个直接后果是,Unix系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix下打开的话,在每行的结尾可能会多出一个^M符号
实际观测一:
在Windows下建立一个文本文件file.txt,内容如下(在UltraEdit或NotePad++下面查看):
在Linux下用od查看,的确看到每行以CRLF结尾
qqxxz@IED42_83_sles10:~$ od -x file.txt
0000000 0d61 620a 0a0d
0000006
使用vim查看
显示正常,说明CR被vim忽略掉了
使用dos2unix转换一下
qqxxz@IED42_83_sles10:~$ dos2unix file.txt
dos2unix: converting file file.txt to UNIX format ...
qqxxz@IED42_83_sles10:~$ od -x file.txt
0000000 0a61 0a62
0000004
发现CR被删除了,每行的结尾只剩下了LF
实际观测二:
但是如果我们把文件转化为mac格式(以CR结尾)
在linux用od查看,看到每行是以CR结尾
qqxxz@IED42_83_sles10:~$ od -x file.txt
0000000 0d61 0d62
0000004
使用vim查看
就变成了所有内容都在一样,并且有很多^M,这个^M实际上就是CR,而由于没有LF,因此linux无法识别出换行信息。
解决:
1 去掉^M
1)在vim使用替换命令
:1,$ s/^M//g
^M使用ctrl-V,ctrl-M输入
2)使用tr来清除
cat file.txt |tr -d "r" > newfile.txt
3)直接使用dos2unix
2 将^M替换为CRLF
1)直接使用mac2unix
版权声明:本文为博主原创文章,未经博主允许不得转载。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 今天刚上手爬虫,当然要从最简单的开始啦,验证一下所学的知识
- Python数据可视化入门:使用Matplotlib绘图
- 有了音乐下载器,怎么能没有音乐播放器呢,打造自己的音乐播放器
- 七夕节到了,单身狗程序员要对自己好点,用代码送自己点安慰
- 面向对象视角下的前端工程体系
- 使用 Python破解大众点评字体加密(SVG反爬虫)
- Python爬虫练习:爬取高清4K桌面壁纸
- 爬取B站18000条《黑神话:悟空》实机演示弹幕,做成词云
- Python爬虫实战:自动化登录网站,爬取商品数据
- 符合自己的工作难找?取招聘网站数据,让你找到心仪的工作
- 虽然现在有可以去码的软件了,可视频是如何自动跟踪打码的?
- Python爬取NBA虎扑球员数据
- 发现一个好看的手机壁纸网站,撸代码的手已经饥渴难耐了
- 手把手用python教你拿即时的卫星影像装饰你的桌面
- PyCharm2019亲测破解方式