当前位置:首页> 正文

关于sql:行尾的’^ M’字符

关于sql:行尾的’^ M’字符

'^M' character at end of lines

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

是什么原因引起的,该如何解决?


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


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

:set fileformat=unix

:w


原因是基于Windows的操作系统和基于Unix的操作系统存储行尾标记的方式不同。

基于Windows的操作系统,由于其具有DOS的传统,因此将行尾存储为一对字符-0x0D0A(回车+换行符)。基于Unix的操作系统仅使用0x0A(换行符)。您看到的^M0x0D的视觉表示(回车)。

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


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

在命令提示符下:$ vi filename

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

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

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


尝试使用dos2unix剥离^ M。


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

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


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

1
2
perl -pie 's/
//g'
filename.txt

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

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


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

Sed的使用范围更广,如果未安装dos2unix,Sed也可以执行这种操作

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

您也可以尝试tr:

1
2
cat hello.txt | tr -d
 > helloUNIX2.txt

结果如下:

1
2
3
4
5
6
7
8
9
10
11
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编辑器中替换^ M个字符,请使用以下命令

打开文本文件,说t1.txt

1
vi t1.txt

通过按shift + :进入命令模式

然后按提及的%s/^M/
/g

1
IN above ^M IS NOT (shift + 6)M instead it IS (ctrl + V)(ctrl + M)

dos2unix命令的替代方法是使用标准工具,例如sed

例如,
dos到unix:

1
2
sed 's/
$//'
dos.txt > unix.txt

待办事项:

1
2
sed 's/$/
/'
unix.txt > dos.txt


使用tr将DOS / Windows( r n)行尾转换为Unix( n)行尾:

1
2
3
4
tr '

'
'
'
< dosFile.txt > unixFile.txt

通过Unix命令行发布有关替换换行符的信息


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

1
2
sed -i'.bak' s/
//g *.*

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

1
rm -v *.bak

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


在Perl中,如果您不想设置$ /变量并使用chomp(),则还可以执行以下操作:

1
2
3
$var =~ /

//g;

我的两分钱


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


展开全文阅读

相关内容