it-swarm.cn

行尾的'^ M'字符

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

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

94
Paul Reiners

它是由DOS/Windows行结束字符引起的。就像安迪·惠特菲尔德所说,Unix命令dos2unix将有助于解决问题。如果需要更多信息,可以阅读该命令的手册页。

76
Thomas Owens

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

:set fileformat=unix

:w

73
Tim Abell

原因是基于Windows的操作系统和基于Unix的操作系统如何存储行尾标记之间的区别。

基于Windows的操作系统,由于它们的DOS传统,将行尾作为一对字符存储 - 0x0D0A(回车+换行)。基于Unix的操作系统只使用0x0A(一个 换行 )。你看到的^M0x0D(a 回车 )的直观表示。

dos2unix 将有助于此。您可能还需要将脚本源调整为“Unix友好”。

39
ColinYounger

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

从命令提示符:$ vi filename

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

全局搜索和替换全部是:%s/^M//g 按住控制然后按V然后按M ”这将取代^ M,什么也没有。

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

24
Bernie Perez

尝试使用dos2unix剥离^ M.

13
Andy Whitfield

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

要获得^M持有 CTRL 按键 V 然后 M (同时按住控制键)和^M将出现。这将找到所有出现并替换它们。

9
dogbane

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

Perl -pie 's/\r//g' filename.txt
8
Bill the Lizard

^ M通常由Windows运算符换行引起,并且转换为Unix看起来像^ M。命令dos2unix应该很好地删除它们

dos2unix [options] [-c convmode] [-o file ...] [-n infile outfile ...]

7
jW.
C:\tmp\text>dos2unix hello.txt helloUNIX.txt

如果没有安装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.  
5
JGurtz

要在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)
4
leeladharan acharya

dos2unix命令的替代方法是使用标准实用程序,如sed

例如,dos到unix:

sed 's/\r$//' dos.txt > unix.txt

unix to dos:

sed 's/$/\r/' unix.txt > dos.txt
3
g4th

将DOS/Windows(\ r\n)行结尾转换为Unix(\ n)行结尾,使用tr:

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

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

1
Mason Wright

您可以通过sed命令直接从文件中删除^ M,例如:

sed -i'.bak' s/\r//g *.*

如果您对更改感到满意,请删除.bak文件:

rm -v *.bak
1
kenorb

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

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

我的两分钱

0
Ariel Monaco

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

0
Allan Wind