当我在Unix环境中运行特定的SQL脚本时,我在SQL脚本的每一行的末尾看到一个'^ M'字符,因为它回显到命令行。我不知道最初创建SQL脚本的操作系统。
导致此问题的原因以及如何解决?
答案 0 :(得分:76)
这是由DOS / Windows行结束字符引起的。就像安迪·惠特菲尔德所说,Unix命令dos2unix将有助于解决问题。如果需要更多信息,可以阅读该命令的手册页。
答案 1 :(得分:73)
通过运行以下命令在vi
中修复行结尾:
:set fileformat=unix
:w
答案 2 :(得分:39)
原因是基于Windows的操作系统和基于Unix的操作系统如何存储行尾标记之间的区别。
基于Windows的操作系统,由于其DOS传统,将行尾作为一对字符存储 - 0x0D0A
(回车+换行)。基于Unix的操作系统只使用0x0A
(line feed)。您看到的^M
是0x0D
(carriage return)的直观表示。
dos2unix将对此有所帮助。您可能还需要将脚本源调整为“Unix友好”。
答案 3 :(得分:24)
最简单的方法是使用vi
。 我知道这听起来很糟糕,但很简单,已经安装在大多数UNIX环境中。 ^ M是来自Windows / DOS环境的新行。
从命令提示符:$ vi filename
然后按“:
”进入命令模式。
全局搜索和全部替换:%s/^M//g
“按住控制按钮,然后按V键
M “这将取代^ M没有任何东西。
然后写下并退出输入“:wq
”完成!
答案 4 :(得分:13)
尝试使用dos2unix剥离^ M.
答案 5 :(得分:9)
在vi中,执行:%s/^M//g
要获得^M
按住 CTRL 键,请按 V 然后按 M (两者同时按住控制键) ^M
会出现。这将找到所有事件,并替换它们。
答案 6 :(得分:8)
SQL脚本最初是在Windows操作系统上创建的。 '^ M'字符是Windows和Unix的结果,它们对于用于行尾字符的内容有不同的想法。您可以在命令行中使用perl来解决此问题。
perl -pie 's/\r//g' filename.txt
答案 7 :(得分:7)
^ M通常由Windows运算符换行引起,并且转换为Unix看起来像^ M。命令dos2unix应该很好地删除它们
dos2unix [options] [-c convmode] [-o file ...] [-n infile outfile ...]
答案 8 :(得分:5)
C:\tmp\text>dos2unix hello.txt helloUNIX.txt
Sed更广泛,如果没有安装dos2unix,也可以做这种事情
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.
答案 9 :(得分:4)
要在vi编辑器中替换^ M个字符,请使用
打开文本文件说t1.txt
vi t1.txt
按shift + :
然后按提及的%s/^M/\r/g
in above ^M is not (shift + 6)M instead it is (ctrl + V)(ctrl + M)
答案 10 :(得分:3)
dos2unix
命令的替代方法是使用sed
等标准实用程序。
例如, dos to unix:
sed 's/\r$//' dos.txt > unix.txt
unix to dos:
sed 's/$/\r/' unix.txt > dos.txt
答案 11 :(得分:1)
您可以通过sed命令直接从文件中删除^ M,例如:
sed -i'.bak' s/\r//g *.*
如果您对更改感到满意,请删除.bak文件:
rm -v *.bak
答案 12 :(得分:1)
将DOS / Windows(\ r \ n)行结尾转换为Unix(\ n)行结尾,使用tr:
tr '\r\n' '\n' < dosFile.txt > unixFile.txt
答案 13 :(得分:0)
od -a $file
对于在Linux上探索这些类型的问题很有用(类似于上面的dumphex)。
答案 14 :(得分:0)
在Perl中,如果你不想设置$ /变量并使用chomp(),你也可以这样做:
$var =~ /\r\n//g;
我的两分钱
答案 15 :(得分:-1)
另一个vi命令::%s/.$//
这将删除文件中每行的最后一个字符。这个搜索和替换命令的缺点是它不关心最后一个字符是什么,所以要小心不要再调用它。