当我在Unix环境中运行特定的SQL脚本时,我在该SQL脚本的每一行的末尾看到一个'^ M'字符,因为它回显了命令行。我不知道最初在哪个OS上创建SQL脚本。
是什么原因引起的,该如何解决?
当我在Unix环境中运行特定的SQL脚本时,我在该SQL脚本的每一行的末尾看到一个'^ M'字符,因为它回显了命令行。我不知道最初在哪个OS上创建SQL脚本。
是什么原因引起的,该如何解决?
Answers:
这是由DOS / Windows行尾字符引起的。就像安迪·惠特菲尔德(Andy Whitfield)所说的那样,Unix命令dos2unix将帮助解决该问题。如果需要更多信息,可以阅读该命令的手册页。
brew install dos2unix
安装自制软件后,您可以在OSX上轻松获得该工具
vi
通过运行以下命令来修复行尾:
:set fileformat=unix
:w
^M
由于某些原因,这不会删除。参考文件:/etc/timidity/fluidr3_gm.cfg
。
原因是基于Windows的操作系统和基于Unix的操作系统存储行尾标记的方式不同。
基于Windows的操作系统,由于它们具有DOS的传统,因此将行尾存储为一对字符- 0x0D0A
(回车+换行符)。仅使用基于Unix的操作系统0x0A
(换行符)。在^M
你看到的是一个可视化表示0x0D
(一个回车)。
dos2unix将对此有所帮助。您可能还需要将脚本源调整为“ Unix友好”。
^M
呢?为什么是“ ^”?为什么是“ M”?
SQL脚本最初是在Windows操作系统上创建的。'^ M'字符是Windows和Unix关于在行尾使用什么字符的不同想法的结果。您可以在命令行中使用perl来解决此问题。
perl -pie 's/\r//g' filename.txt
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.
使用tr将DOS / Windows(\ r \ n)行尾转换为Unix(\ n)行尾:
tr '\r\n' '\n' < dosFile.txt > unixFile.txt
在Perl中,如果您不想设置$ /变量并使用chomp(),则还可以执行以下操作:
$var =~ /\r\n//g;
我的两分钱
另一个vi命令将执行:%s/.$//
此操作:删除文件中每行的最后一个字符。该搜索和替换命令的缺点是它并不在乎最后一个字符是什么,因此请注意不要两次调用它。