Sql '^M';行尾字符
在Unix环境中运行特定的SQL脚本时,在SQL脚本的每行末尾都会看到一个“^m”字符,因为它会回显到命令行。我不知道SQL脚本最初是在哪个操作系统上创建的Sql '^M';行尾字符,sql,unix,newline,line-endings,os-dependent,Sql,Unix,Newline,Line Endings,Os Dependent,在Unix环境中运行特定的SQL脚本时,在SQL脚本的每行末尾都会看到一个“^m”字符,因为它会回显到命令行。我不知道SQL脚本最初是在哪个操作系统上创建的 什么原因导致此问题?如何修复此问题?尝试使用dos2unix删除^M。这是由DOS/Windows行结束字符引起的。正如Andy Whitfield所说,Unix命令dos2unix将有助于解决这个问题。如果您想了解更多信息,可以阅读该命令的手册页。该^M通常是由Windows运算符换行符引起的,并翻译到Unix上,看起来像^M。dos2u
什么原因导致此问题?如何修复此问题?尝试使用dos2unix删除^M。这是由DOS/Windows行结束字符引起的。正如Andy Whitfield所说,Unix命令dos2unix将有助于解决这个问题。如果您想了解更多信息,可以阅读该命令的手册页。该^M通常是由Windows运算符换行符引起的,并翻译到Unix上,看起来像^M。dos2unix命令应该可以很好地删除它们
dos2unix[选项][c convmode][o文件…][-n infle outfile…][/p>SQL脚本最初是在Windows操作系统上创建的。“^M”字符是由于Windows和Unix对如何使用行尾字符有不同的想法。您可以在命令行中使用perl来解决这个问题
perl -pie 's/\r//g' filename.txt
在vi中,执行一个
:%s/^M//g
要获取
^M
,请按住CTRL键,然后按V,然后M(同时按住控制键),此时将显示^M
。这将查找所有出现的标记,并将其替换为零。原因是基于Windows的操作系统和基于Unix的操作系统存储行尾标记的方式不同
由于其DOS传统,基于Windows的操作系统将行尾存储为一对字符-0x0D0A
(回车+换行)。基于Unix的操作系统只使用0x0A
(a)。您看到的^M
是0x0D
(a)的视觉表示
我会帮你的。您可能还需要将脚本的源代码调整为“Unix友好型”。最简单的方法是使用
vi
。我知道这听起来很糟糕,但它很简单,并且已经安装在大多数UNIX环境中。^M是Windows/DOS环境中的新行
从命令提示符:$vi filename
然后按“:
”进入命令模式
全局搜索和替换全部是:%s/^M//g
“按住control键,然后按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-一个$file
有助于探索Linux上的这些类型的问题(类似于上面的dumphex)。通过运行以下命令修复vi
中的行尾:
:设置fileformat=unix
:w
在Perl中,如果不想设置$/变量并使用chomp(),还可以执行以下操作:
$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
命令的替代方法是使用标准实用程序,如sed
比如说,,
dos到unix:
sed 's/\r$//' dos.txt > unix.txt
unix操作系统:
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
tr'\r\n'\n'unixFile.txt
当然可以,你可以使用perl,但是你会建议perl而不是dos2unix吗?我只是提供一个替代方案,因为已经有四个人说要使用dos2unix。是的,我发现这很有用,因为我在一个落后的工作站上,在一个有着史前IT部门的办公室里工作。除了我使用了一个变体:perl-pi-e“s/\x0D/\n/g”file.csvOn一些系统(例如Ubuntu)这个命令的名称是“fromdos”,当你安装了自制软件时,你可以通过
brew install dos2unix
在OSX上很容易地获得这个工具。我不会说当前版本的Windows有任何DOS传统。不过,它们仍然有兼容性限制。这是一个简单的方法,你可以使用一个自动转换工具。谢谢,但为什么^M
?为什么是“^”?为什么是“M”?因为它是一个“控制字符”。“^”是单击控制键的视觉表示。在它的特定字节下面,^是编辑器表示它们的方式。你的最后一行是我在前面所有答案中遗漏的内容。我一直得到“未找到匹配项bc我在执行shift+6,所以我做了每个黑客都会做的事情,并用我自己的解决方案来避免我的误解:记录一个宏,使$do转到每行的末尾,然后按x,只需对文件中的行数重复宏。如何在emacs中替换它?感谢对如何键入^M字符的解释!我会将其替换为\r。所以我做了:%s/^M/\r/g这是一个很好的答案。非常感谢。(已保存安装dos2unix,一个我可能只会使用一次的工具)由于某些原因,这不会删除^M
s。参考文件:/etc/timidity/fluidr3\u gm.cfg
。如果知道它不可靠,为什么要提及它?要用unix友好的换行符替换^M::%s/^M/\r/g