行尾的'^ M'字符
当我在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"(换行符)。我们看到的^ M
是0x0D
(回车)的直观表示。
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