linux下与windows下的换行符

回车符号和换行符号产生背景

 关于“回车”(carriage return)和“换行”(line feed)这两个概念的来历和区别。
在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。
     于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。
这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。
      后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。
Unix系统里,每行结尾只有“<换行>”,即“\n”;Windows系统里面,每行结尾是“ <回车><换行>”,即“\r\n”;Mac系统里,每行结尾是“<回车>”。一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号

windows创建的文件是 \n\r结束的, 而linux,mac这种unix类系统是\n结束的。

所以unix的文本到windows会出现换行丢失(ultraedit这种软件可以正确识别); 而反过来就会出现^M的符号了

Windows等操作系统用的文本换行符和UNIX/Linux操作系统用的不同,Windows系统下输入的换行符在UNIX/Linux下不会显示为“换行”,而是显示为 ^M 这个符号(这是Linux等系统下规定的特殊标记,占一个字符大小,不是 ^ 和 M 的组合,打印不出来的)。Linux下很多文本编辑器(命令行)会在显示这个标记之后,补上一个自己的换行符,以避免内容混乱(只是用于显示,补充的换行符不会写入文件,有专门的命令将Windows换行符替换为Linux换行符)。 UNIX/Linux系统下的换行符在Windows系统的文本编辑器中会被忽略,整个文本会乱成一团。

 

windows换行是\r\n,十六进制数值是:0D0A。
LINUX换行是\n,十六进制数值是:0A
所以在linux保存的文件在windows上用记事本看的话会出现黑点,我们可以在LINUX下用命令把linux的文件格式转换成win格式的。
unix2dos 是把linux文件格式转换成windows文件格式
dos2unix 是把windows格式转换成linux文件格式。

 

linux下删除windows换行符^M

OJ判题时发现一个问题:用%c读入的代码都会报wa。后来发现跟scanf有关。在linux下使用%c会读到\n和\r两个字符。所以需要将^M(也就是\r)字符删掉
删除方法不少。找了一个比较简单的。
要将a.txt里的^M去掉并写入b.txt,则使用如下指令cat a.txt | tr -d "^M" > b.txt
注意:语句中的^M是通过ctrl+V, ctrl+M输入的。特指/r字符

unix   下换行符只有:   \r
Dos   下换行符有:\r\n
具体的,   \r的ascii   码是:14
                 \n的ascii   码是:10


<think>好的,用户想了解在Linux下如何删除换行符。这个问题看起来是关于文本处理的,我得先理清楚用户的具体需求。可能用户遇到了文本文件中有多余换行符的情况,需要处理掉。 首先,用户可能知道换行符LinuxWindows中的不同,比如Windows用CRLF,而Linux用LF。但用户这里可能是指普通的换行符,也就是\n,想将它们删除,使得多行变成一行。 接下来,我需要考虑常见的工具,比如sed、tr、awk、perl等。这些工具都可以处理文本中的换行符。但具体怎么用呢? 用tr的话,通常用来删除字符,可以用-d选项。但tr处理的是单个字符,换行符是\n,所以可以尝试tr -d '\n'。不过要注意,这样会把所有换行都删掉,导致整个文件变成一行。但tr可能无法处理多行替换的情况,或者是否有其他问题? 然后是sed,sed可以处理更复杂的替换。比如用sed ':a;N;$!ba;s/\n//g' 文件。这里需要解释一下这个命令。:a是创建一个标签,N将下一行追加到模式空间,$!ba如果不是最后一行就跳转到a标签,这样会把整个文件读入模式空间,然后替换所有的换行符。不过这个语法有点复杂,用户可能需要更简单的版本,或者需要解释清楚每个部分的作用。 另外,使用sed的-z选项,在GNU sed中,-z表示用空字符分隔记录,这样整个文件会被当作一行处理,可以用s/\n//g替换所有换行符。例如sed -z 's/\n//g' 文件。但需要注意,这可能处理包含空字符的文件会有问题,不过通常文本文件不含空字符,所以可能可行。 还有awk,可以用awk '{printf "%s", $0}' 文件,这样每行输出时不换行,但这样可能不会完全删除所有换行符,因为输入中的换行符可能被保留?或者可能需要设置ORS为空,比如awk 'BEGIN {ORS=""} {print}' 文件,这样输出记录分隔符为空,所有行合并成一行。 另外,perl也是一个选项,perl -pe 's/\n//g' 文件,但这样可能不会一次性处理所有行,需要加上-0777选项来读取整个文件,perl -0777 -pe 's/\n//g' 文件。这样就能全部替换了。 还要考虑是否有中间的空行或者多个换行符的情况,用户是否需要删除所有换行符,还是替换成其他字符。比如是否用空格代替换行符,这时候可以用tr '\n' ' ',把每个换行换成空格。 另外,直接使用echo或者printf的话,可能不太方便处理文件,所以还是推荐使用上述工具。 需要注意,如果文件很大,使用sed或tr可能会有效率问题,但对于一般情况应该没问题。 最后,用户可能需要实际例子,比如具体的命令解释,以及不同方法的优缺点。比如tr最简单,但只能处理单个字符;sedperl更灵活,可以处理整个文件;awk适合需要更复杂处理的情况。 总结一下,回答应该分步骤介绍不同方法,给出命令示例,并说明注意事项,比如备份原文件,处理后的输出可能需要重定向到新文件等。</think>在Linux系统中删除换行符可通过多种命令行工具实现。以下是具体方法及注意事项: --- ### 一、使用 `tr` 命令 `tr` 是一个简单高效的字符替换/删除工具。 ```bash tr -d '\n' < input.txt > output.txt ``` - **作用**:删除所有换行符(`\n`),将文件内容合并为单行。 - **注意**:会删除所有换行符,包括原本段落间的合理换行。 --- ### 二、使用 `sed` 命令 `sed` 是流编辑器,适合复杂文本处理。 #### 方法1:传统方式 ```bash sed ':a; N; $!ba; s/\n//g' input.txt > output.txt ``` - **解释**: - `:a` 创建标签 `a` - `N` 将下一行追加到模式空间 - `$!ba` 如果不是最后一行,跳转回标签 `a` - `s/\n//g` 删除所有换行符 #### 方法2:GNU sed 的简化方式 ```bash sed -z 's/\n//g' input.txt > output.txt ``` - **原理**:`-z` 选项以空字符分隔记录,将整个文件视为单行处理。 --- ### 三、使用 `awk` 命令 `awk` 适合按行处理并控制输出格式。 ```bash awk 'BEGIN {ORS=""} {print}' input.txt > output.txt ``` - **解释**:`ORS`(Output Record Separator)设置为空,使所有行输出无换行符。 --- ### 四、使用 `perl` `perl` 提供更灵活的文本处理能力。 ```bash perl -0777 -pe 's/\n//g' input.txt > output.txt ``` - **解释**:`-0777` 表示以“段落模式”读取整个文件,`s/\n//g` 删除所有换行符。 --- ### 五、替换换行符为其他字符(如空格) 若需保留段落分隔,可将换行符替换为空格: ```bash tr '\n' ' ' < input.txt > output.txt ``` --- ### 注意事项 1. **备份文件**:操作前建议备份原文件(`cp input.txt input.bak`)。 2. **大文件处理**:`sed` `perl` 会将整个文件加载到内存,处理超大文件时需谨慎。 3. **跨平台换行符**:Windows文件(`\r\n`)需先转换: ```bash dos2unix input.txt # 删除CR字符(\r) ``` --- ### 示例验证 假设 `input.txt` 内容为: ``` Hello World ``` 执行 `tr -d '\n' < input.txt` 后输出: ``` HelloWorld ``` 选择工具时,可根据需求灵活选用:简单场景用 `tr`,复杂处理用 `sed` 或 `perl`。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值