关于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/.$//这将删除文件中每行的最后一个字符。此搜索和替换命令的缺点是它并不在乎最后一个字符是什么,因此请注意不要两次调用它。


推荐阅读

    linux命令行输入汉字?

    linux命令行输入汉字?,系统,软件,发行,管理,终端,命令,模式,编辑,文件,文本,L

    linux开启终端命令行?

    linux开启终端命令行?,密码,系统,电脑,终端,首页,工具,软件,命令,权限,用户,l

    linux命令行重命名?

    linux命令行重命名?,图片,名字,名称,软件,代码,文件,命令,文件名,批量,方面,L

    linux命令行3中文?

    linux命令行3中文?,工作,地址,系统,信息,标准,命令,目录,网上,功能,内核,linu

    linux命令行进入图文?

    linux命令行进入图文?,系统,密码,终端,电脑,网络,传播,情况,图形界面,命令,

    linux命令行交互界面?

    linux命令行交互界面?,系统,密码,状态,终端,信息,工具,环境,情况,首页,界面,l

    linux怎么调用命令行?

    linux怎么调用命令行?,系统,地址,工具,工作,首页,终端,命令,密码,信息,情况,l

    linux命令行权限不够?

    linux命令行权限不够?,档案,系统,权限,密码,文件,命令,终端,目录,文件名,用

    linux查看命令行进程?

    linux查看命令行进程?,系统,软件,信息,状态,进程,名称,实时,命令,数据,电脑,

    linux命令行大全软件?

    linux命令行大全软件?,系统,工作,软件,地址,信息,管理,官网,命令,工具,基础,l

    实现linux远程命令行?

    实现linux远程命令行?,软件,名称,地址,工具,密码,网络,服务,代码,系统,电脑,

    linux下命令行浏览器?

    linux下命令行浏览器?,地址,传播,工具,网站,软件,发行,网址,首次,官网,系统,l

    vim运行linux命令?

    vim运行linux命令?,系统,工作,信息,地址,命令,标准,时间,情况,工具,基础,linu

    字符串查找命令linux?

    字符串查找命令linux?,系统,字符串,工具,信息,文件,命令,字符,选项,文本,范

    linux常用命令行工具?

    linux常用命令行工具?,系统,工作,工具,地址,管理,信息,命令,软件,目录,基础,l

    linux命令行写错了?

    linux命令行写错了?,系统,环境,位置,软件,名称,密码,状态,代码,预期,异常,十

    linux命令行专业工具?

    linux命令行专业工具?,工具,系统,工作,信息,服务,环境,基础,命令,管理,发行,l

    linux下载打包命令行?

    linux下载打包命令行?,软件,系统,名称,工具,官网,文件,命令,目录,下面,表示,l

    linux命令行如何复制?

    linux命令行如何复制?,位置,系统,文件,命令,目录,工作,源文件,目标,文件名,

    linux启动进去命令行?

    linux启动进去命令行?,系统,工具,首页,电脑,终端,材料,密码,命令,快捷键,窗