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

造成这种情况的原因是什么以及如何解决?

有帮助吗?

解决方案

这是由 DOS/Windows 行结束字符引起的。正如 Andy Whitfield 所说,Unix 命令 dos2unix 将帮助解决这个问题。如果您需要更多信息,可以阅读该命令的手册页。

其他提示

修复行结尾 vi 通过运行以下命令:

:set fileformat=unix

:w

原因是基于 Windows 的操作系统和基于 Unix 的操作系统存储行结束标记的方式不同。

基于 Windows 的操作系统,由于其 DOS 传统,将行尾存储为一对字符 - 0x0D0A (回车+换行)。基于Unix的操作系统只需使用 0x0A (A 换行)。这 ^M 你看到的是视觉表现 0x0D (A 回车).

DOS2UNIX 会对此有所帮助。您可能还需要将脚本源调整为“Unix 友好”。

最简单的方法是使用 vi. 我知道这听起来很糟糕但是 它很简单并且已经安装在大多数 UNIX 环境中。^M 是来自 Windows/DOS 环境的新行。

从命令提示符处: $ vi filename

然后按“:" 进入命令模式。

全局搜索并替换全部是 :%s/^M//g "按住控制,然后按V然后按M" 它将把 ^M 替换为空。

然后写入并退出输入“:wq“ 完毕!

尝试使用 dos2unix 去掉 ^M。

在 vi 中,执行 :%s/^M//g

为了得到 ^M 持有 控制键 按键 V 然后 中号 (同时按住控制键)和 ^M 会出现。这将找到所有出现的情况并将其替换为空。

SQL 脚本最初是在 Windows 操作系统上创建的。'^M' 字符是 Windows 和 Unix 对于行尾字符的使用有不同想法的结果。您可以在命令行中使用 perl 来解决此问题。

perl -pie 's/\r//g' filename.txt

^M 通常是由 Windows 操作符换行符引起的,翻译到 Unix 上看起来像 ^M。命令 dos2unix 应该可以很好地删除它们

dos2unix [选项] [-c 转换模式] [-o 文件 ...] [-n infile outfile ...]

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.  

要在 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 to 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 ( ) 行结尾转换为 Unix ( ) 行结尾,使用 tr:

tr '\r\n' '\n' < dosFile.txt > unixFile.txt

关于从 Unix 命令行替换换行符的帖子

od -a $file 对于在 Linux 上探索这些类型的问题很有用(类似于上面的 dumphex)。

在 Perl 中,如果您不想设置 $/ 变量并使用 chomp() 您也可以这样做:

$var =~ /\r\n//g;

我的两分钱

另一个 vi 命令可以做到: :%s/.$// 这将删除文件中每行的最后一个字符。此搜索和替换命令的缺点是它不关心最后一个字符是什么,因此请小心不要调用它两次。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top