Windows & Linux 文件格式之迷 < VI下删除文本中的^M>

本文详细介绍了Unix与Windows系统在文本文件换行方式上的区别,并提供了解决方案以确保文件在不同系统间无缝传输。重点讨论了如何在Vim编辑器中删除多余的^M字符,以及在不同场景下使用工具和命令进行文件格式转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于回车与换行
很久以前,老式的电传打字机使用两个字符来另起新行。一个字符把滑动架移回首位 (称为回车,ASCII码为0D),另一个字符把纸上移一行 (称为换行,ASCII码为0A)。当计算机问世以后,存储器曾经非常昂贵。有些人就认定没必要用两个字符来表示行尾。UNIX 开发者决定他们可以用一个字符来表示行尾, Linux沿袭Unix,也是。Apple 开发者规定了用.开发 MS-DOS以及Windows 的那些家伙则决定沿用老式的.
三种行尾格式如下:
unix : n
dos : rn
mac : r
这意味着,如果你试图把一个文件从一种系统移到另一种系统,那么你就有换行符方面的麻烦。
因为MS-DOS及Windows是回车+换行来表示换行,因此在Linux下用Vim查看在Windows下写的代码,行尾后“^M”符号。 www.2cto.com
在Vim中解决这个问题,很简单,在Vim中利用替换功能就可以将“^M”都删掉,键入如下替换命令行:
:%s/^M//g
注意:
上述命令行中的“^M”符,不是“^”再加上“M”,而是由“Ctrl+v”、“Ctrl+M”键生成的,或者Ctrl+v,再按回车。
或者使用这个命令:
:% s/r//g

(1)问题提出
我们可能会遇到过这样一些困惑:
A, 如何查看一个文件或数据流的二进制格式(以十六进制格式显示)?
B,为什么在 windows下编辑的 shell 脚本在 Unix下不能执行?为什么在 windows下编辑的 C 源文件在有些 gcc 编译器下不能编译?
C,为什么我在 vi 等编辑器下打开一个文本文件会包含 ^M,如何把它去掉?为什么我在 windows 上用记事本打开 unix上的文件,文件都不换行?

(2)分析与方案

A,如何查看一个文件的二进制格式(以十六进制格式显示)?
方法一:在 UtraEdit 使用 Ctrl + H 切换到十六进制编辑模式。** 注意 ** :此方法一有缺陷,它会将行末的单个"换行符"显示成 "回车" + "换行" 两个字符。

方法二:使用文件或流的二进制查看工具 fbin。

B,为什么在 windows下编辑的 shell 脚本在 Unix下不能执行?为什么在 windows下编辑的 C 源文件在有些 gcc 编译器下不能编译?

原因分析:unix 的 shell 脚本不能识别 "回车符" (即:CR,'r'),Windows 文件格式换行时,总是以 "回车" + "换行" ,导致 unix 下的 shell 无法正常解释。解决方法:就是把 windows 格式的中的 "回车" 符删除。

方法一:使用 vi 打开源文件,把 'rn' 替换成 'n' ;** 缺点 ** :不适合大量文件的批量作业。

方法二:使用 UtraEdit 把 Windows 格式的文件转换成 Unix 格式。文件-->转换-->Unix转DOS;** 缺点 ** :不适合大量文件的批量作业。

方法三:Unix 下的 dos2unix 命令,如 $ dos2unix -k xx.c;** 缺点 ** :此方法有一致命缺陷,它会改变原来的文件属性,如一个可执行 shell 脚本的可执行属性及其它属性,转换后都将会丢掉;** 优点 ** :适合大量普通文件本文件的批量作业。

方法四: win2unix (windows,unix 均可使用),功能类似 dos2unix,如 win2unx xx.c;** 优点** :克服了 dos2unix 的所有缺点,它能保留源文件的任何属性。还适合大量文件的批量作业。

C,为什么我在vi 等编器下打开一个文本文件会包含^M,如何把它去掉? 为什么我在windows上用记事本打开unix上的文件,文件都不换行?

原因分析:要解决这个问题,必先弄清 unix 与 windows 文本文件的差异。如下:
1) 磁盘中 Windows 文本文件总是以 "回车" + "换行"的形式进行换行的。
2) 磁盘中 Unix 格式的文本文件,总是以"换行符"(即:LF,'n') 换行,而非 "回车换行符"。(Unix 规定:unix 文本文件保存到磁盘时,总是自动把 "回车换行符" 转换成 "回车符" 保存,输出到终端时由终端自动将将 "回车符" 转换成 "回车换行符" 输出)

** 结论 1 **:这样在 windows 的记事本中打开 Unix 格式的文件时,因为文件中没有 'r',所以无法正常显示换行,结果就会把所有的内容显示在同一行中。

** 结论 2 **:UtraEdit 等工具会自动检测文件中是否包含'r',当检查行末缺少'r'时,一般它会提示要求进行Unix 到Windows 格式的转换(相信都遇到这个提示信息)。

** 结论 3 **:UtraEdit 和 vi 等工具,在保存文件时会自动依照文件原来的格式进行保存。即:如打开的如是 windows 格式它会把文件依然按 windows 格式保存(不进行自动转换);如打开的如是unix 格式它会把文件依然按 unix 格式保存(不进行自动转换)。

Linux编辑器vim中删除行尾的^M有时候,在Linux中使用打开曾在Windows中编辑过的文件时,会在行尾看到^M字符。看起来总是感觉很别扭。删除方法如下:在Vim的命令模式中输入:%s/^M$//g后,回车即会自动删除该文件中的所有^M字符。注意:^M要用Ctrl+v, Ctrl+m来输入,M后面的$代表匹配行尾的内容,最后的g则表示每行中匹配到的内容都要置换。


可以用以下方法快速的解决:

 

方法1:
在命令模式下:输入:%s/^M//g 然后,回车即可替换

注,其中"^M"的输入,分别是“Ctrl+v”、“Ctrl+M”键生成的

 

方法2: 

使用vi打开文本文件
    vi dos.txt
    命令模式下输入
    :set fileformat=unix
    :w

方法3:

使用sed 工具
    sed ’s/^M//’ filename > tmp_filename

方法4:

既然window下的回车符多了‘\r’,那么当然通过删除‘\r’ ,也可以实现:
    tr -d '\r'

方法5:(最常用的方法)

    在终端下敲命令:
    $ dos2unix filename
    直接转换成unix格式,就OK了!~


 

补充:

将Windows中的文本文件传到Linux后,会在每行的末尾多出一个^M符号。当进行Shell编程时,该符号可能会导致正则表达式匹配失败。如果想 去掉这个符号可以使用dos2unix命令。当然如果想恢复为Windows下的模式可以使用unix2dos命令。   当从Windows传来一个文件时,可以使用vim -b 命令来打开该文件,这样就能看到行尾的^M符号了,否则是看不到的。

 


&lt;think&gt;好的,用户想了解Linux文件中^M符号的含义以及删除方法。首先,我需要解释^M的来源。这应该是因为WindowsLinux使用不同的换行符导致的,Windows是\r\n,而Linux是\n,所以当文件从Windows复制到Linux时,多余的\r会被显示为^M。接下来,用户可能需要具体的删除方法。常见的办法包括使用dos2unix工具,或者用sed、tr命令处理。比如tr -d &#39;\r&#39;&lt; file&gt; newfile,或者sed-i&#39;s/\r//g&#39; file。这些方法都能去掉\r字符。还要考虑用户是否处理多个文件,可能需要脚本批量处理。引用中提到的那个脚本可以用tr命令循环处理,生成临时文件再替换原文件。这样用户处理大量文件时更方便。另外,用户可能不太熟悉命令行,需要给出具体的步骤示例,比如如何安装dos2unix,或者如何运行脚本。需要确保命令的正确性,避免误操作。比如提醒用户备份文件,防止数据丢失。 还要注意不同系统下换行符的差异,解释清楚为什么会出现^M,这样用户能更好地理解问题根源。可能用户是开发者或者系统管理员,经常需要处理跨平台文件,所以给出实际应用中的建议也很重要,比如在版本控制中统一换行符设置。 最后,检查是否有遗漏的方法,比如vi编辑器中替换的方法,或者使用perl等其他工具。确保覆盖用户可能遇到的不同情况,提供多种解决方案供选择。&lt;/think&gt;### Linux文件中^M符号的含义及删除方法 #### 一、^M符号的含义 1. **符号来源** WindowsLinux系统的换行符不同: - **Windows**:使用回车符(`\r`)和换行符(`\n`),即`\r\n`[^1][^3]。 - **Linux**:仅使用换行符(`\n`)[^1][^2]。 当文件从Windows复制到Linux时,多余的`\r`会被显示为`^M`(在终端中显示为`Ctrl+M`的符号)。 2. **影响** - 可能导致脚本执行错误(例如`bash`解释器报错`$&#39;\r&#39;: command not found`)[^1]。 - 影响文本文件的格式(如日志文件、配置文件)。 --- #### 二、删除^M符号的方法 ##### 方法1:使用`tr`命令 ```bash tr -d &#39;\r&#39; &lt; 原文件 &gt; 新文件 # 示例:处理文件test.txt并覆盖原文件 tr -d &#39;\r&#39; &lt; test.txt &gt; tmp.txt &amp;&amp; mv tmp.txt test.txt ``` **原理**:直接删除`\r`字符[^2][^4]。 --- ##### 方法2:使用`sed`命令 ```bash sed -i &#39;s/\r//g&#39; 文件名 # 示例:处理当前目录下所有.txt文件 sed -i &#39;s/\r//g&#39; *.txt ``` **参数说明**: - `-i`:直接修改文件内容(无需生成临时文件)[^4]。 --- ##### 方法3:使用`dos2unix`工具 1. **安装工具**(如未预装): ```bash # Debian/Ubuntu sudo apt-get install dos2unix # CentOS/RHEL sudo yum install dos2unix ``` 2. **转换文件**: ```bash dos2unix 文件名 # 批量处理所有文件 dos2unix * ``` --- ##### 方法4:在`vi`编辑器中处理 1. 打开文件: ```bash vi test.txt ``` 2. 输入替换命令: ```vim :%s/^M//g ``` **注意**:`^M`需通过`Ctrl+V`+`Ctrl+M`输入(显示为`^M`)。 --- #### 三、批量处理脚本(参考引用[^4]) ```bash #!/bin/bash for file in &quot;$@&quot; do if [ -f &quot;$file&quot; ]; then tr -d &#39;\r&#39; &lt; &quot;$file&quot; &gt; &quot;${file}.tmp&quot; &amp;&amp; mv &quot;${file}.tmp&quot; &quot;$file&quot; echo &quot;已处理: $file&quot; fi done ``` **使用方法**: 1. 保存为`remove_cr.sh`,添加执行权限: ```bash chmod +x remove_cr.sh ``` 2. 执行脚本: ```bash ./remove_cr.sh *.txt # 处理所有txt文件 ``` --- #### 四、验证结果 ```bash cat -A 文件名 # 查看文件中的特殊符号(^M应已消失) ``` --- #### 五、最佳实践建议 1. **版本控制配置**: 在Git中设置自动转换换行符: ```bash git config --global core.autocrlf input ``` 2. **跨平台协作**: 统一团队使用`LF`(Linux风格换行符)[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值