行结尾的'^ M'字符

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

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

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

vi通过运行以下代码修复行结束符:

:set fileformat=unix

:w

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

基于Windows的操作系统,由于他们的DOS遗产,存储作为一对字符的0x0D0A0x0D0A (回车+换行)。 基于Unix的操作系统只使用0x0A (一个换行符 )。 您看到的^M是一个0x0D的视觉表示( 回车 )。

dos2unix将帮助这一点。 您可能还需要将脚本的来源调整为“Unix友好”。

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

从命令提示符: $ vi filename

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

全部search和全部replace为:%s/^M//g 按住控制键,然后按V然后按M键 ,这将replace^ M。

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

尝试使用dos2unix去除^ M。

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

要获得^M按住CTRL键,按V然后按M (两者都按住控制键),然后出现^M 这将find所有的事件,并取而代之的是什么。

SQL脚本最初是在Windows操作系统上创build的。 '^ M'字符是Windows和Unix对于用于行尾字符的结果不同的结果。 你可以在命令行使用perl来解决这个问题。

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

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

dos2unix [options] [-c convmode] [-o文件…] [-n infile outfile …]

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

Sed是更广泛可用的,如果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. 

要在vi编辑器中replace^ 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) 

dos2unix命令的替代方法是使用像sed这样的标准实用程序。

例如,dos到unix:

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

unix到dos:

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

将DOS / Windows(\ r \ n)行结尾转换为Unix(\ n)行尾,tr:

 tr '\r\n' '\n' < dosFile.txt > unixFile.txt 

发布有关从Unix命令行中replace新行的信息

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

在Perl中,如果你不想设置$ /variables并使用chomp(),你也可以这样做:

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

我的两分钱

您可以直接通过sed命令从文件中删除^ M,例如:

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

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

 rm -v *.bak 

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

Interesting Posts