题 行尾的'^ M'字符


当我在Unix环境中运行特定的SQL脚本时,我在SQL脚本的每一行的末尾看到一个'^ M'字符,因为它回显到命令行。我不知道最初创建SQL脚本的操作系统。

造成这种情况的原因是什么?如何解决?


90
2017-09-15 17:07


起源




答案:


它是由DOS / Windows行结束字符引起的。就像Andy Whitfield所说,Unix命令dos2unix将有助于解决问题。如果需要更多信息,可以阅读该命令的手册页。


70
2017-09-16 15:52



在某些系统(即Ubuntu)上,此命令的名称为“fromdos” - bobwienholt
您可以使用OSX轻松获得该工具 brew install dos2unix 当你安装了自制软件 - philipp


修复行结尾 vi 通过运行以下内容:

:set fileformat=unix

:w


71
2017-09-15 17:11



这是一个很好的答案。非常感谢。 (保存安装dos2unix,我可能只使用一次的工具) - Jamsi
+1。它太干净了。 - La-comadreja
完美的工作。 - david_p
这不会删除 ^M由于某种原因。参考文件: /etc/timidity/fluidr3_gm.cfg。 - Blauhirn


原因是基于Windows的操作系统和基于Unix的操作系统如何存储行尾标记之间的区别。

基于Windows的操作系统,由于其DOS传统,将行尾存储为一对字符 - 0x0D0A (回车+换行)。基于Unix的操作系统就是使用的 0x0A (一个 换行)。该 ^M 你看到的是一个视觉表现 0x0D (一个 回车)。

DOS2UNIX的 将有助于此。您可能还需要将脚本的源代码调整为“Unix友好”。


39
2017-09-15 17:32



我不会说当前版本的Windows有任何类型的DOS 遗产。但是,它们仍然具有兼容性限制。 - Joey
这是一种简单的方法,就是你做一个自动转换工具。谢谢 - pjl
但为什么 ^M?为什么'^'?为什么'M'? - uprego
因为它是一个“控制角色”。 “^”是单击控制键的直观表示。在它的特定字节下面,^是编辑器代表它们的方式。 - Hejazzman


最简单的方法是使用 vi我知道这听起来很可怕但是 它很简单,已经安装在大多数UNIX环境中。 ^ M是来自Windows / DOS环境的新行。

从命令提示符: $ vi filename

然后按“:“进入命令模式。

全局搜索和替换全部是 :%s/^M//g “按住控制按钮然后按V键 中号“这将取代^ M没有任何东西。

然后写入并退出输入“:wq“做完了!


24
2017-09-15 17:06



如何在emacs中替换它? - herbertD
谢谢! VI(M)很棒! - Ionică Bizău
感谢您对如何输入^ M字符的扩展!我会用\ r \ n替换它。所以我做了:%s / ^ M / \ r / g - aharris88


尝试使用dos2unix剥离^ M.


13
2017-09-15 17:10





在vi中,做一个 :%s/^M//g

得到的 ^M 持有 CTRL 按键 V 然后 中号 (两者同时拿着控制键)和 ^M 会出现。这将找到所有出现并替换它们。


9
2017-09-15 17:10



要使用unix友好换行符替换^ M: :%s/^M/\r/g - Gary Oak


SQL脚本最初是在Windows操作系统上创建的。 '^ M'字符是Windows和Unix的结果,它们对于用于行尾字符的内容有不同的想法。您可以在命令行中使用perl来解决此问题。

perl -pie 's/\r//g' filename.txt

8
2017-09-15 17:08



当然,你可以使用perl,但是你会建议使用perl而不是dos2unix吗? - Thomas Owens
我只是提供了另一种选择,因为有四个人已经说过要使用dos2unix。 - Bill the Lizard
是的,我觉得这很有用,因为我在一个在史前IT部门办公室工作的后台工作站。除了我使用了一个变体:perl -pi -e“s / \ x0D / \ n / g”file.csv - Rimian


^ M通常由Windows运算符换行引起,并且转换为Unix看起来像^ M。命令dos2unix应该很好地删除它们

dos2unix [options] [-c convmode] [-o file ...] [-n infile outfile ...]


7
2017-09-15 18:31





C:\tmp\text>dos2unix hello.txt helloUNIX.txt

如果没有安装dos2unix,Sed甚至可以更广泛地使用,也可以做这种事情

C:\tmp\text>sed s/\r// hello.txt > helloUNIX.txt  

你也可以尝试tr:

cat hello.txt | tr -d \r > helloUNIX2.txt  

结果如下:

C:\tmp\text>dumphex hello.txt  
00000000h: 48 61 68 61 0D 0A 68 61 68 61 0D 0A 68 61 68 61 Haha..haha..haha  
00000010h: 0D 0A 0D 0A 68 61 68 61 0D 0A                   ....haha..  

C:\tmp\text>dumphex helloUNIX.txt  
00000000h: 48 61 68 61 0A 68 61 68 61 0A 68 61 68 61 0A 0A Haha.haha.haha..  
00000010h: 68 61 68 61 0A                                  haha.  

C:\tmp\text>dumphex helloUNIX2.txt  
00000000h: 48 61 68 61 0A 68 61 68 61 0A 68 61 68 61 0A 0A Haha.haha.haha..  
00000010h: 68 61 68 61 0A                                  haha.  

5
2017-09-15 19:54