当我在Unix环境中运行特定的SQL脚本时,我在SQL脚本的每行末尾都看到一个'^ M'字符,因为它被回显到命令行。我不知道SQL脚本最初是在哪个操作系统上创建的。行结尾'^ M'字符
这是什么原因造成的?我该如何解决?
当我在Unix环境中运行特定的SQL脚本时,我在SQL脚本的每行末尾都看到一个'^ M'字符,因为它被回显到命令行。我不知道SQL脚本最初是在哪个操作系统上创建的。行结尾'^ M'字符
这是什么原因造成的?我该如何解决?
这是由DOS/Windows行尾字符引起的。像Andy Whitfield说的那样,Unix命令dos2unix将帮助解决这个问题。如果您需要更多信息,您可以阅读该命令的手册页。
尝试使用dos2unix去除^ M。
^M通常是由Windows操作符换行引起的,并且翻译成Unix看起来像是^ M。该命令应DOS2UNIX的删除它们很好地
DOS2UNIX的[选项] [-c convmode] [-o文件...] [-n INFILE OUTFILE ...]
SQL脚本最初是在Windows中创建OS。 '^ M'字符是Windows和Unix对于用于行尾字符的结果有不同意见的结果。你可以在命令行使用perl来解决这个问题。
perl -pie 's/\r//g' filename.txt
当然,你可以使用perl,但是你会建议perl over dos2unix吗? – 2008-09-15 17:11:00
我只是提供了一个替代方案,因为有四个人已经说过使用dos2unix。 – 2008-09-15 17:17:35
是的,我发现这很有用,因为我是在一个拥有史前IT部门的办公室工作的落后工作站。 除了我使用了一个变种:perl -pi -e“s/\ x0D/\ n/g”file.csv – Rimian 2010-02-10 23:36:30
在六,做一个:%s/^M//g
要获得^M
保持CTRL键,按V然后中号(两者同时按住Ctrl键)和^M
就会出现。这将查找所有的事件,并将其替换为无。
用一个unix友好换行符替换^ M:`:%s/^ M/\ r/g` – 2014-02-26 19:46:59
原因是基于Windows的操作系统和基于Unix的操作系统如何存储行尾标记。
由于其DOS遗产,基于Windows的操作系统将一行结尾存储为一对字符 - 0x0D0A
(回车+换行)。基于Unix的操作系统只使用0x0A
(a line feed)。您看到的^M
是0x0D
(a carriage return)的直观表示。
dos2unix将对此有所帮助。您可能还需要将脚本的来源调整为“Unix友好”。
最简单的方法是使用vi
。
我知道这听起来很糟糕,但
它很简单,并且已经安装在大多数UNIX环境中。^M是来自Windows/DOS环境的新行。
从命令提示符:$ vi filename
然后按 “:
” 去指挥模式。
搜索和替换所有在全球范围内是:%s/^M//g
“按住Ctrl键,然后按V,那么 中号”,这将有什么替代^ M。
然后写入并退出输入“:wq
”完成!
将执行的另一个vi命令::%s/.$//
这将删除文件中每行的最后一个字符。这个搜索和替换命令的缺点是它不关心最后一个字符是什么,所以要小心不要调用它两次。
C:\tmp\text>dos2unix hello.txt helloUNIX.txt
桑达甚至更广泛的应用,可以做这种事情也如果没有安装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.
od -a $file
对于在Linux上探索这些类型的问题很有用(类似于上面的dumphex)。
修复行结束在vi
运行以下:
:set fileformat=unix
:w
在Perl中,如果你不想设置$ /变量和使用格格(),你可以也可做:
$var =~ /\r\n//g;
我的两分钱
要更换^下面
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)
dos2unix
命令的替代方案将使用标准实用程序lik e sed
。
例如, DOS到UNIX:
sed 's/\r$//' dos.txt > unix.txt
UNIX到DOS:
sed 's/$/\r/' unix.txt > dos.txt
可以从文件直接经由sed命令删除^ M,例如:
sed -i'.bak' s/\r//g *.*
如果您对更改感到满意,请删除。BAK文件:
rm -v *.bak
转换DOS/Windows的(\ r \ n)的行结束到UNIX(\ n)的行尾,与TR:
tr '\r\n' '\n' <dosFile.txt> unixFile.txt
在一些系统(即Ubuntu)这个命令的名字是“fromdos” – bobwienholt 2012-12-04 16:12:06
当你安装了自制软件时,你可以用`brew install dos2unix`很容易地获得OSX上的工具 – philipp 2013-06-12 17:04:21