Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql '^M';行尾字符_Sql_Unix_Newline_Line Endings_Os Dependent - Fatal编程技术网

Sql '^M';行尾字符

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

在Unix环境中运行特定的SQL脚本时,在SQL脚本的每行末尾都会看到一个“^m”字符,因为它会回显到命令行。我不知道SQL脚本最初是在哪个操作系统上创建的


什么原因导致此问题?如何修复此问题?

尝试使用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