当我在Unix环境中运行特定的SQL脚本时,我在该SQL脚本的每一行的末尾看到一个'^ M'字符,因为它回显了命令行。 我不知道最初在哪个OS上创建SQL脚本。
是什么原因引起的,该如何解决?
这是由DOS / Windows行尾字符引起的。就像安迪·惠特菲尔德(Andy Whitfield)所说的那样,Unix命令dos2unix将帮助解决该问题。如果需要更多信息,可以阅读该命令的手册页。
通过运行以下命令来修复vi中的行结尾:
:set fileformat=unix
:w
原因是基于Windows的操作系统和基于Unix的操作系统存储行尾标记的方式不同。
基于Windows的操作系统,由于其具有DOS的传统,因此将行尾存储为一对字符-0x0D0A(回车+换行符)。基于Unix的操作系统仅使用0x0A(换行符)。您看到的^M是0x0D的视觉表示(回车)。
dos2unix将对此有所帮助。您可能还需要将脚本的源代码调整为" Unix友好"。
最简单的方法是使用vi。 我知道这听起来很糟糕,但是 strike>它很简单,并且已经安装在大多数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
通过按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文件:
od -a $file对于在Linux上探索这些类型的问题很有用(类似于上述的dumphex)。
在Perl中,如果您不想设置$ /变量并使用chomp(),则还可以执行以下操作:
我的两分钱
另一个将执行的vi命令::%s/.$//这将删除文件中每行的最后一个字符。此搜索和替换命令的缺点是它并不在乎最后一个字符是什么,因此请注意不要两次调用它。