文本文件换行符

article/2025/8/30 1:39:57

  文本文件的每一行结尾用一个或者两个特殊的ASCII字符进行标识,这个标识就是换行符,不同的操作系统中会采用不同的换行符。


1.CR、LF、CRLF

  主要的换行符有三种:LF(Line Feed即换行,转义字符用“\n”表示,十六进制0x0A),CR(Carriage Return 即回车,转义字符用“\r”表示,十六进制0x0D)和CRLF(由两个字符“CR+LF”组成,即“\r\n”,十六进制0x0D 0x0A)。它们的使用范围如下:

  • CR换行符:用于Commodore 8位机、TRS-80、苹果II家族、Mac OS 9及更早版本。
  • LF换行符:用于Multics、Unix、类Unix(如GNU/Linux、AIX、Xenix、Mac OS X、FreeBSD等)、BeOS、Amiga、RISC OS等操作系统中。
  • CRLF换行符:用于DEC TOPS-10、RT-11和其他早期的非Unix,以及CP/M、MP/M、DOS(MS-DOS、PC-DOS等)、Atari TOS、OS/2、Microsoft Windows、Symbian OS、Palm OS等系统中。

  一般操作系统上的运行库会自动决定文本文件的换行格式:程序在Windows上运行就生成CRLF换行格式的文本文件,而在Linux上运行就生成LF格式换行的文本文件。因此,当我们在Windows系统上编辑文本文件时,敲下“enter”键或者写入“\n”,系统会经过一个隐式的转换,将“\n”转换成“\r\n”再写入文件,反过来当我们对文件进行读取时,系统又会进行一个隐式的转换,将读取到的“\r\n”转换为“\n”输出。下面我们来看一个Windows上读写文本文件的示例:


这里写图片描述

我们新建了一个文本文件“test.txt”,并向其中写入了“\n”,

这里写图片描述

用hexdump命令查看“test.txt”的十六进制码,发现“\n”转换成了0d 0a,也即“\r\n”,

这里写图片描述

再对“test.txt”进行读取,发现其中的“\r\n”又被转换成了“\n”。

  在Python中,使用os.linesep命令,可以获取当前操作系统的换行符:

Windows: 这里写图片描述


Linux: 这里写图片描述

  实际上,自从苹果的Mac OS从第10版转向Unix内核开始,依据不同的文本文件换行符,主流的操作系统可以划分为两大阵营,一方是微软的Windows,使用CRLF作为换行符,另外一方包括Unix、类Unix(如Linux和Mac OS X等)使用LF作为换行符。分属不同阵营的操作系统之间交换文本文件会因为换行符的不同而造成麻烦:编辑器不能识别换行符,可能会显示为特殊字符,如Linux上的编辑器显示的“^M”特殊字符,就是拜Windows的CRLF换行符所赐;或者丢弃换行符,如来自Linux的文本文件,在Windows上打开可能会因为识别不了换行符,导致所有的行合并。
  在不同平台间使用FTP软件传送文件时,在ASCII文本模式传输模式下,一些FTP客户端程序会自动对换行格式进行转换。经过这种传输的文件字节数可能会发生变化,如果你不想ftp修改原文件,可以使用bin模式(二进制模式)传输文本。

2.特殊字符“^M”

  上一节我们已经讲过,Windows系统采用“\r\n”作为换行符,而Linux系统采用“\n”作为换行符,所以当一个用Windows下的换行符的文件在Linux下用VIM打开的时候,单行的最后一个字符就变成了 “\r”,“\r”在 ASCII 码中是0x0D,而0x0D在VIM中被显示为“^M”。如下图:


这里写图片描述

注意,在用VIM打开时,要加-b选项,否则“^M”字符会被隐藏起来,代之以左下角的[dos]标志,以提示你该文本文件采用的是CRLF换行符。

  现在我们来考虑一个很自然的问题,就是如何去掉上述因跨平台而产生的“^M”字符。方法其实有很多,接下来我们将介绍比较常用的几种:

1. dos2unix:首先在你的Linux机器上安装dos2unix,该命令的作用是将文件中的“\r\n”转换成“\n”。具体的用法可以通过“man dos2unix”命令去了解,这里我们只提两种:
dos2unix -o file #对文件file进行转换,转换完成后写入源文件file,默认采用此种模式
dos2unix -n oldfile newfile #对文件oldfile进行转换,转换完成后写入新文件newfile
与之对称的是unix2dos命令,可将文件中的“\n”转换成“\r\n”,读者自行了解。
2. VIM字符替换:采用VIM的替换命令“%s/^M//g”或者“%s/\r//g”即可。有两点需要注意的是:a).在VIM中,“^M”字符的输入方式是“[ctrl-v-m]”;b).必须采用“vim -b”模式打开文件,否则行末的“^M”字符会因为被隐藏而无法匹配到。
3. VIM “set ff=unix”:该命令可以将带有[dos]标志文件转为unix格式,也即将CRLF换行符替换为LF。有两点需要注意的是:a).区别于dos2unix,该命令并不能将文件中的所有“\r\n”转换为“\n”,只有当文件左下角出现[dos]标志时,该命令才能起作用;b).即使是采用CRLF换行符的文件,如果你用“vim -b”去打开的话,也不会出现[dos]标志,因此该命令也不会起作用。与之对称的是“set ff=dos”命令,可将unix格式的文件转换为dos格式,读者自行了解。
4. sed & tr:采用Linux下的sed或者tr命令可以对文件中的“^M”进行替换或者删除操作,具体用法这里不赘述,读者自行了解。

3.留一个问题

  讲到这里,关于文本文件换行符的基本内容都大致讲完了,不过,还有一个问题我们没有提及:换行符可以看作是行的结束符,也可以看作行之间的分隔符,这两种处理方式之间存在一些歧义。如果换行符被当作分隔符,那么文件的最后一行就不需要再有换行符。但是多数系统的做法是在最后一行的后面也加上一个换行符,也就是把换行符看作是行的结束符。这样的程序在处理末行没有换行符的文件时,可能会存在问题。相反地,有的程序把换行符看作分隔符,就会把最末尾的换行符看作是新行的开始,也就是多出了一个空行。关于这个问题,此处我们先留着,以后再作讲解。


参考文献

[1] http://blog.csdn.net/crazyingbird/article/details/7174499
[2] http://blog.csdn.net/knowledgeaaa/article/details/23911201
[3] http://blog.csdn.net/wzb56_earl/article/details/6860358
[4] https://sphenginx.github.io/2014/12/24/CRLF-in-Unix-like_Windows-os/
[5] https://www.zhihu.com/question/19751023
[6] http://jsonliangyoujun.iteye.com/blog/2363195
[7] http://blog.khotyn.com/blog/2014/11/15/damn-the-carriage-return-character/
[8] http://www.worldhello.net/gotgit/08-git-misc/040-eol.html
[9] https://zh.wikipedia.org/wiki/%E6%8F%9B%E8%A1%8C
[10] https://en.wikipedia.org/wiki/Newline
以上为本文的全部参考文献,对原作者表示感谢。


http://chatgpt.dhexx.cn/article/xgvm16na.shtml

相关文章

html语言中的换行标签是,什么是换行符标签

HTML语言中换行的代码是什么? 方法有很多,但要做到用的恰到好处 段落标签 一个段落空一行 效果如下: 是默认的换行,在你要换行的地方加进去就行,单个标签 效果如下: 如果有了 ……,从到中的内容…

html语言换行格式,html换行符br标签

br标签的作用 在 html 源代码中对内容进行编辑,如果直接采用回车换行,那么浏览器解析的结果可能会是一个空格、或者被忽略,正确的做法是使用< br / >标签,在 html 语言中,br标签定义为一个换行符,所以应将它理解为简单的输入一个空行,而不是用来对内容进行分段。 …

html语言换行符,html换行符

在html源代码中对内容进行编辑&#xff0c;如果直接采用回车换行&#xff0c;那么浏览器解析的结果可能会是一个空格、或者被忽略&#xff0c;正确的做法是使用标签&#xff0c;在html语言中&#xff0c;br标签定义为一个换行符&#xff0c;所以应将它理解为简单的输入一个空行…

html怎么换行?换行代码是什么?九种html文字换行方法总结

在用html写网页时&#xff0c;为了让网页中内容看起来整洁流畅&#xff0c;我们需要将其中的文字内容进行换行&#xff0c;那么&#xff0c;html怎么来换行呢&#xff1f;本篇文章就来给大家介绍一下html中给文字换行的方法。 打造全网web前端全栈资料库&#xff08;总目录&am…

零基础HTML入门教程(11)——换行br

本章目录 1.任务目标2.br换行标签3.代码演示4.小结 1.任务目标 我们上一小节学习了img图像&#xff0c;我们这一小节学习一下新的标签br换行标签&#xff0c;并且熟练使用。 2.br换行标签 br 可插入一个简单的换行符。 br 标签是空标签&#xff08;意味着它没有结束标签&…

求菲波那切数列数列第n项三种方法小结

菲波那切数列数列的应用场景还是比较多的&#xff0c;比如可以在考试的时候考你递归啊&#xff0c;早上碰到的一道题就是这样&#xff0c;骄傲地写下递归方程&#xff0c;结果TLE了&#xff0c;然后旁边的大神给我说了一个叫滚动数组的东西。。。题目是这样的You are climbing …

PTA题库函数递归 菲波那切数列(递归版)

请编写递归函数&#xff0c;求菲波那切(Fibonacci)数列某一项的值。 0, 1, 1, 2, 3, 5, 8, 13 , 21, 34, 55, 89, 144, ... 函数原型 double Fib(int index);说明&#xff1a;参数 index 为数列项的索引号&#xff0c;从 0 开始计数。函数值为 Fibonacci 数列第 index 项的值…

菲波那切数列(Java)

题目&#xff1a; 写一个函数&#xff0c;输入n&#xff0c;求斐波那契&#xff08;Fibonacci&#xff09;数列的第n项。斐波那契数列的定义如下&#xff1a; 知识点&#xff1a; 递归&#xff1a;是在一个函数的内部调用这个函数自身。循环&#xff1a;则是通过设置计算的初…

求解斐波那切数列的几种算法

斐波那切数列我们并不陌生。在百度百科中我们可以找到有关它的定义&#xff1a;斐波纳契数列&#xff08;Fibonacci Sequence&#xff09;&#xff0c;又称黄金分割数列&#xff0c;指的是这样一个数列&#xff1a;1、1、2、3、5、8、13、21、……在数学上&#xff0c;斐波纳契…

Python多种方法生成菲波那切数列

文章目录 一、顺序输出二、利用递归函数实现三、循环四、利用列表实现五、利用reduce实现六、利用生成器实现七、利用魔术方法实现 记录多种方法生成菲波那切数列 一、顺序输出 代码如下&#xff1a; # 第一种方法 顺序输出# 获取用户输入数据 num int(input("你需要几项…

斐波那契数列详解

目录 1.认识斐波那契数列 1.1 什么是斐波那契数列 1.2 斐波那契数列的规律 2.用代码的思维实现斐波那契数列 2.1 确定要查找第几个斐波那契数列 2.2 如何利用斐波那契数列规律 2.3 如何利用循环实现斐波那契数列 2.4 如何进入循环 2.5 如何跳出循环 1.认识斐波那契数列 …

求斐波那契数列的三种方法

什么是斐波那契数列&#xff0c;1,1,2,3,5,8,13...这样一个数列就是斐波那契数列&#xff0c;求第n项的值。 一、经典求法 观察数列可得&#xff0c;除了第一项和第二项&#xff0c;所有的数列的值都是前一项和前一项的前一项的加和&#xff0c;转换成函数也就是f(n) f(n-1)…

斐波那契数列

斐波那契数列来源于兔子繁殖问题&#xff0c;所以也叫兔子序列。   最开始我一直不能理解兔子问题怎么和斐波那契数列联系在一起的&#xff0c;然后画了这个图之后&#xff0c;就明白了。   第一年有一对小兔子&#xff0c;一年后成年。成年的兔子又可以生出一对小兔子&…

深入浅出总结求解菲波那切数列的五种方法

文章目录 题目思路一: 递归思路二: 递归 剪枝 (递归的优化)思路三: 动态规划思路四: 迭代 (动态规划的优化)思路五: 矩阵运算 快速幂 题目 菲波那切数列 定义 a0 0, a1 1, a2 1, an an − 1 an − 2, 求 an 是多少? 思路一: 递归 由于每一项都遵循这个公式: an an −…

图解寻址方式

注: 学习自 唐朔飞《计算机组成原理》 图自 唐朔飞《计算机组成原理》PPT整合 寻址方式 一丶指令寻址 二丶数据寻址 堆栈寻址

寻址方式一

目录 立即数、寄存器、存储器的概念 数据寻址方式 立即寻址&#xff1a; 寄存器寻址&#xff1a; 存储器寻址: 注意&#xff1a; 立即数、寄存器、存储器的概念 立即数&#xff1a;参与操作的数据本身&#xff0c;8位或16位 &#xff08;只能作为src,无法成为dst&#xf…

计算机寻址方式

一、指令寻址 1.两种方式 顺序寻址 每次寻址后 PC自动 1 &#xff1b; 跳跃寻址 当跳转到 JUP 指令时 其后的为立即数指令 &#xff0c;便跳转到对应的指令数。 数据寻址 立即寻址特征 地址村的为立即数特征 直接寻址特征 形式地址为&#xff1a; 操作数的真实地址 隐含寻…

指令格式与寻址方式

指令与指令系统 指令: 控制计算机完成某种操作的命令。 指令系统&#xff1a; 处理器所能识别的所有指令的集合。 指令的兼容性&#xff1a; 同一系列机的指令都是兼容的。 汇编语言&#xff1a; 指令助记符。 指令格式 例如&#xff1a; 寻址方式 操作数可能的来源或…

寻址方式介绍

根据指令内容确定操作数地址的过程称为寻址。完善的寻址方式可为用户组织和使用数据提供方便。 ①直接寻址&#xff1a;指令地址域中表示的是操作数地址。 ②间接寻址&#xff1a;指令地址域中表示的是操作数地址的地址即指令地址码对应的存储单元所给出的是地址A&#xff0c…

8086寻址方式

8086寻址方式 寻址方式总共有两大类: 按数据寻址 按地址寻址 1.数据寻址方式 MOV DST,SRC和数据有关的寻址方式 1.立即寻址: 操作数直接在源操作数中给出 MOV AL,45H 源操作数在指令中给出,立即数只能是源操作数 立即数的长度和DST长度一致 2.寄存器寻址 操作数放在指定的寄存…