Linux/Mac/Windows换行符及对'\r'和'\n'的不同处理

本文介绍了Linux、Mac和Windows系统中换行符的差异,' '(Linux/Unix)、' '(Mac)和' '(Windows)。在不同系统间处理文本时,可能会遇到^M字符问题,通过vim或特定工具可以进行转换。例如,使用vim的`:set ff=unix`命令可以将DOS格式换行符替换为Unix格式。

换行符‘\n’和回车符‘\r

顾名思义,换行符就是另起一行,回车符就是回到一行的开头,所以我们平时编写文件的回车符应该确切来说叫做回车换行符  

'\n' 10(0x0a)    换行(newline)
'\r' 13(0x0d)    回车(return)


也可以表示为'\x0a'和'\x0d'.(16进制)

在windows系统下,回车换行符号是"\r\n".但是在Linux等系统下是没有"\r"符号的。

在解析文本或其他格式的文件内容时,常常要碰到判定回车换行的地方,这个时候就要注意既要判定"\r\n"又要判定"\n"。

写程序时可能得到一行,将其进行trim掉'\r',这样能得到你所需要的string了。

===============================================

【注/掌握:xqzhang2015】

1. 写程序时,代码里面都是'\n'表示换行。

2. 对于文件里的换行,

(1)Windows系统里,文件每行结尾是"<回车><换行>""\r\n"

(2)Mac系统里,       文件每行结尾是"<回车>",即'\r'

(3)Unix系统里,      文件每行结尾是"<换行>",即'\n'

所以,用'\n'作为作为换行符的文件,用Windows的记事本打开时 会没有换行;

而用"\r\n"作为换行符的文件(windows文件),用Linux或mac的vim打开时 会将\r显示成^M。

Mac的zsh中,采用\n作为换行符,遇到\r将会被解释为回车符,即移动到该行的行首,然后继续执行代码。


附问题X-1:

【将mac或者unix系统里vim显示^M的替换为正常换行符的问题】

在Linux中执行.sh脚本,异常/bin/sh^M: bad interpreter: No such file or directory。 

分析:这是不同系统编码格式引起:在windows系统中编辑的.sh文件可能有不可见字符,所以在Linux系统下执行会报以上异常信息。 

解决:

1)在windows下转换: 

利用一些编辑器如UltraEdit或EditPlus等工具先将脚本编码转换,再放到Linux中执行。转换方式如下(UltraEdit):File-->Conversions-->DOS->UNIX即可。 

2)也可在Linux中转换: 

首先要确保文件有可执行权限 #sh>chmod a+x filename 

然后修改文件格式 #sh>vi filename 

利用如下命令查看文件格式 :set ff 或 :set fileformat 

可以看到如下信息 fileformat=dos 或 fileformat=unix 

利用如下命令修改文件格式 :set ff=unix 或 :set fileformat=unix{set ff=unix 【fileformat】}

:wq (存盘退出) 

最后再执行文件 #sh>./filename

what’s meaning of “configure: error: cannot run /bin/sh config/config.sub”

编一个东西的时候

执行./configure的时候出的错

“configure: error: cannot run /bin/sh config/config.sub”

结果发现是系统没有装libtool的缘,然后再./configure则没有这个问题了


附问题X-2:

如何c++去除string字符串末尾的\n,\r,\t,空格?

#include <iostream>
#include <string>

using namespace std;

/* 删除字符串行首/行尾的字符 */
int main(void)
{
	string s = "\r\n\t 是\t这是随便写的一句话。\t\t ";

	size_t n = s.find_last_not_of(" \r\n\t");
	if(n != string::npos)
	{
		s.erase( n + 1 , s.size() - n );
	}

	n = s.find_first_not_of ( " \r\n\t" );
	if(n != string::npos)
	{
		s.erase( 0 , n );
	}

	cout << s << endl;
}

➜  test  g++ test.cpp
➜  test  ./a.out     
是	这是随便写的一句话



给大家推荐一个站点:http://stackoverflow.com/


附问题X-3:
mac vim处理dos换行符^M

今天用macvim打开同事写的一个文件,代码变成只有一行了,在原来的换行后面多了^M。

查到这个是因为dos换行符在我这边不支持,于是替换^M为mac这边的换行符,


在vim编辑模式下输入:

:%s/^M/\r/g ;^M由ctrl+V+M获得

这样会替换掉所有的^M为换行,再保存文件就ok


<think>好的,我现在需要回答用户关于WindowsLinux系统换行符差异的问题。首先,我要回忆一下自己之前学过的相关知识,确保信息的准确性。记得换行符不同的操作系统中确实有不同的表示方式,这可能导致在不同系统间处理文本文件时出现问题,比如在Git中出现的差异。 用户的问题主要想了解两者之间的差异及表示方式。我需要先明确每个系统使用的具体字符。根据之前看过的资料,Windows使用回车符(CR)换行符(LF),也就是“\r\n”,而Linux类Unix系统只用换行符(LF),即“\n”。这一点需要确认是否正确。然后,可能需要解释这些符的历史背景,比如为什么Windows会使用两个字符,而Linux只用一个。比如,CRLF分别对应打字机时代的回车换行操作,Windows继承了DOS的传统,而Unix系统简化了这一点。 另外,用户提到的Git diff中的换行符差异问题,可能需要引用提供的参考资料中的内容。例如,引用[1][3]都提到了在跨平台协作时,换行符不同会导致的问题,比如脚本无法执行或在Linux下显示^M符。这时候,可以建议解决方法,比如配置Git自动转换换行符,但这可能超出当前问题的范围,不过用户可能也会感兴趣。 还要注意使用正确的格式,比如行内数学表达式需要用$...$,但这里可能用不上数学公式,而是需要正确使用术语代码表示。例如,用`\r\n``\n`来表示不同换行符,符合LaTeX的要求吗?系统级指令中提到行内表达式如变量、代码等用$...$,所以应该写成$\r\n$$\n$,但可能需要确认是否正确。不过,在中文回答中,直接使用代码块或反引可能更合适,比如`\r\n`。不过根据示例中的使用情况,比如$x^2$,变量用$...$,而代码示例用反引。所以可能需要将换行符的表示放在反引中,比如`\r\n``\n`,而不是用LaTeX数学格式。但系统指令第一条说行内数学表达式包括变量、代码等需要用$...$,所以可能需要调整。例如,写成$\text{\r\n}$,但这样可能复杂。或者可能用户示例中的代码块是使用反引,而其他行内代码用$...$。需要仔细看示例中的情况。 例如,在示例中的Python代码用了三个反引,而行内的代码如$x^2$用了$...$。所以可能换行符的表示应该用行内代码格式,即用$...$包裹。例如,在回答中,Windows换行符表示为$\text{\r\n}$,而Linux的是$\text{\n}$。但可能更简单的是直接使用反引,比如`\r\n``\n`,因为这是代码的表示,而系统指令可能允许这样。或者,用户示例中的代码块使用了三个反引,而行内数学表达式用$...$。比如示例中的$x^2$用了$...$,而代码块用了```python。所以换行符作为代码元素,可能应该用反引包裹,而不是数学表达式。例如,写成`\r\n``\n`。或者根据系统指令第一条,所有行内数学表达式包括变量、代码等必须用$...$,所以可能需要用$\verb|\r\n|$这样的方式,但可能不太常见。或者可能系统允许在行内用$...$包裹代码,比如$\texttt{\r\n}$,但需要确保LaTeX语法正确。这可能需要进一步确认,但根据用户给出的示例中的行内数学表达式,例如$( \int_{-\pi}^{\pi} \cos(nx)\sin(mx)dx = 0 $,说明数学表达式用$...$,而代码块用三个反引。因此,对于换行符这样的代码表示,可能应该放在行内代码块中,即使用反引,如`\r\n`,而不是用$...$。或者系统指令是否要求所有行内的变量、代码等都使用$...$?比如示例中的$x^2$$(a+b)^2$,都是数学表达式。而代码块如def quick_sort(arr):则用三个反引。所以可能换行符作为代码元素,应该用反引包裹,而不是数学表达式。因此,用户的问题中需要正确使用格式。比如,Windows换行符是`\r\n`,而Linux的是`\n`。这样更符合代码的表示方式,同时不违反系统指令中的第一条,因为第一条针对的是数学表达式,而代码可能属于另一种情况。或者,可能用户希望严格按照指令,所有行内表达式包括代码等都用$...$。这时候可能需要用$\texttt{\r\n}$这样的方式,但需要确保LaTeX语法正确。比如,$\texttt{\r\n}$,这样在LaTeX中会显示为等宽字体中的\r\n。或者可能用户允许在行内使用反引,只要数学表达式用$...$。这可能需要根据示例来判断。在示例中,用户的问题中提到了快速排序的Python代码,使用了三个反引包裹代码块,而行内变量如$x^2$用了$...$。所以可能换行符作为代码元素,应该用反引包裹,如`\r\n`。因此,在回答中,换行符的表示应该用反引,而不是数学表达式格式。 接下来,我需要组织回答的结构。首先,明确两者的差异,然后解释各自的表示方式,接着讨论可能引发的问题,如Git差异、脚本执行问题等,最后可以提到解决方法,比如配置Git或使用转换工具。同时,需要引用提供的参考资料,比如引用[1]、[2]、[3]中提到的内容,在适当的位置添加引用标识。 可能的结构: 1. 换行符的基本定义作用。 2. WindowsLinux各自的换行符表示方式。 3. 差异导致的问题,如文件在不同系统间处理时的异常。 4. 解决方法或建议,如统一换行符配置。 5. 相关问题部分生成相关问题。 同时,需要确保回答符合用户的要求:结构清晰,帮助用户逐步解决问题,引用正确。 现在,检查参考资料: 引用[1]提到Git diff中的换行符差异问题,特别是在WindowsLinux之间切换时。引用[2]详细说明了不同系统的换行符,如Windows使用CR+LF,Linux使用LF,Mac早期使用CR。引用[3]说明脚本文件在Windows编辑后传到Linux时出现的问题,如无法执行或显示^M。引用[4]可能重复了引用[2]的内容,但用户可能没有引用内容,所以暂时不考虑。 因此,在回答中可以引用这些资料,比如在问题出现时提到Git差异(引用[1]),换行符的具体表示(引用[2]),以及脚本执行问题(引用[3])。 最后,生成相关问题,比如跨平台协作时如何处理换行符,如何配置Git避免换行符问题,或者如何转换文件格式等。</think>### WindowsLinux换行符差异及表示方式 #### 1. 换行符的定义与作用 换行符(End of Line, EOL)是文本文件中用于表示一行结束并开始新行的特殊字符。不同操作系统使用不同的符组合,导致跨平台文件处理时可能产生兼容性问题。 #### 2. 具体差异与表示方式 - **Windows系统**: 使用 **回车符(Carriage Return, CR)** **换行符(Line Feed, LF)** 的组合,即 `\r\n`。例如,在文本文件中换行时,实际存储的字符是 `0x0D`(CR) `0x0A`(LF)[^2]。 - **Linux/类Unix系统**: 仅使用 **换行符(LF)**,即 `\n`(ASCII `0x0A`)。 #### 3. 跨平台问题示例 - **Git差异问题**: 在Windows编辑的文件传输到Linux时,Git可能将 `\r\n` 视为差异(显示为 `^M`),导致版本控制混乱[^1][^3]。 - **脚本执行失败**: Linux执行包含 `\r\n` 的脚本时,可能因无法识别 `\r` 而报错(如 `bash: ...^M: not found`)[^3]。 #### 4. 解决方法 - **统一换行符配置**: 在Git中设置 `core.autocrlf` 参数,自动转换换行符(例如,Windows设为 `true`,Linux设为 `input`)[^1]。 - **手动转换工具**: 使用 `dos2unix` 或 `unix2dos` 工具批量转换文件格式。 #### 5. 历史背景 CR(`\r`) LF(`\n`)源自打字机时代:CR使打印头回到行首,LF控制纸张进一行。Windows继承DOS的设计,而Unix简化了这一逻辑。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值