行尾的'^ M'字符

时间:2020-03-05 18:53:59  来源:igfitidea点击:

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

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

解决方案

回答

尝试使用dos2unix去除^ M。

回答

这是由DOS / Windows行尾字符引起的。就像安迪·惠特菲尔德(Andy Whitfield)所说的那样,Unix命令dos2unix解决该问题。如果需要更多信息,可以阅读该命令的手册页。

回答

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

dos2unix [选项] [-c convmode] [-o文件...] [-n infile输出文件...]

回答

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

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

回答

在vi中,执行:%s / ^ M // g

要使^ M按住CTRL键,请先按V键再按M键(同时按住控制键),然后会出现^ M键。这将查找所有出现的事件,并将其替换为空。

回答

原因是基于Windows的操作系统和基于Unix的操作系统存储行尾标记的方式之间存在差异。

基于Windows的操作系统,由于其具有DOS的传统,所以将行尾存储为一对字符" 0x0D0A"(回车+换行符)。基于Unix的操作系统仅使用" 0x0A"(换行符)。我们看到的^ M0x0D(回车)的直观表示。

dos2unix将对此有所帮助。我们可能还需要将脚本的源代码调整为" Unix友好"。

回答

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

在命令提示符下:$ vi filename

然后按""进入命令模式。

"全局搜索并替换所有内容是`:%s / ^ M // g""按住控件,然后按V,然后
M",它将完全替换^ M。

然后编写并退出,输入":wq"!

回答

另一个将执行的vi命令::%s /.$//删除文件中每行的最后一个字符。此搜索和替换命令的缺点是它并不在乎最后一个字符是什么,因此请注意不要两次调用它。

回答

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

Sed的使用范围更广,如果未安装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.

回答

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

回答

通过运行以下命令来修复vi中的行尾:

:set fileformat = unix

:w