2008-09-15 122 views
87

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

这是什么原因造成的?我该如何解决?

回答

68

这是由DOS/Windows行尾字符引起的。像Andy Whitfield说的那样,Unix命令dos2unix将帮助解决这个问题。如果您需要更多信息,您可以阅读该命令的手册页。

+3

在一些系统(即Ubuntu)这个命令的名字是“fromdos” – bobwienholt 2012-12-04 16:12:06

+6

当你安装了自制软件时,你可以用`brew install dos2unix`很容易地获得OSX上的工具 – philipp 2013-06-12 17:04:21

13

尝试使用dos2unix去除^ M。

7

^M通常是由Windows操作符换行引起的,并且翻译成Unix看起来像是^ M。该命令应DOS2UNIX的删除它们很好地

DOS2UNIX的[选项] [-c convmode] [-o文件...] [-n INFILE OUTFILE ...]

8

SQL脚本最初是在Windows中创建OS。 '^ M'字符是Windows和Unix对于用于行尾字符的结果有不同意见的结果。你可以在命令行使用perl来解决这个问题。

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

当然,你可以使用perl,但是你会建议perl over dos2unix吗? – 2008-09-15 17:11:00

+2

我只是提供了一个替代方案,因为有四个人已经说过使用dos2unix。 – 2008-09-15 17:17:35

+2

是的,我发现这很有用,因为我是在一个拥有史前IT部门的办公室工作的落后工作站。 除了我使用了一个变种:perl -pi -e“s/\ x0D/\ n/g”file.csv – Rimian 2010-02-10 23:36:30

9

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

要获得^M保持CTRL键,按V然后中号(两者同时按住Ctrl键)和^M就会出现。这将查找所有的事件,并将其替换为无。

+2

用一个unix友好换行符替换^ M:`:%s/^ M/\ r/g` – 2014-02-26 19:46:59

39

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

由于其DOS遗产,基于Windows的操作系统将一行结尾存储为一对字符 - 0x0D0A(回车+换行)。基于Unix的操作系统只使用0x0A(a line feed)。您看到的^M0x0D(a carriage return)的直观表示。

dos2unix将对此有所帮助。您可能还需要将脚本的来源调整为“Unix友好”。

+0

我不会说当前版本的Windows有任何一种DOS *遗产*。不过,它们仍然具有兼容性限制。 – Joey 2013-03-08 12:30:20

+0

这是简单的方法,是你做一个自动转换工具。感谢的 – peter 2015-04-09 13:57:57

24

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

从命令提示符:$ vi filename

然后按 “:” 去指挥模式。

搜索和替换所有在全球范围内是:%s/^M//g按住Ctrl键,然后按V,那么 中号”,这将有什么替代^ M。

然后写入并退出输入“:wq”完成!

-1

将执行的另一个vi命令::%s/.$//这将删除文件中每行的最后一个字符。这个搜索和替换命令的缺点是它不关心最后一个字符是什么,所以要小心不要调用它两次。

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

桑达甚至更广泛的应用,可以做这种事情也如果没有安装DOS2UNIX的

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. 
0

od -a $file对于在Linux上探索这些类型的问题很有用(类似于上面的dumphex)。

68

修复行结束在vi运行以下:

:set fileformat=unix

:w

0

在Perl中,如果你不想设置$ /变量和使用格格(),你可以也可做:

$var =~ /\r\n//g; 

我的两分钱

4

要更换^下面

vi编辑器使用字符M打开文本文件说t1.txt

vi t1.txt 

shift + :

然后按下按键提到%s/^M/\r/g

进入命令模式
in above ^M is not (shift + 6)M instead it is (ctrl + V)(ctrl + M) 
3

dos2unix命令的替代方案将使用标准实用程序li​​k e sed

例如, DOS到UNIX:

sed 's/\r$//' dos.txt > unix.txt 

UNIX到DOS:

sed 's/$/\r/' unix.txt > dos.txt 
0

可以从文件直接经由sed命令删除^ M,例如:

sed -i'.bak' s/\r//g *.* 

如果您对更改感到满意,请删除。BAK文件:

rm -v *.bak