行结尾的'^ M'字符
当我在Unix环境中运行一个特定的SQL脚本时,我在SQL脚本的每行末尾都看到一个'^ M'字符,因为它被回显到命令行。 我不知道SQL脚本最初是在哪个操作系统上创build的。
这是什么原因造成的,我该如何解决?
这是由DOS / Windows行尾字符引起的。 像Andy Whitfield说的那样,Unix命令dos2unix将帮助解决这个问题。 如果您需要更多信息,可以阅读该命令的手册页。
在vi
通过运行以下代码修复行结束符:
:set fileformat=unix
:w
原因在于基于Windows的操作系统和基于Unix的操作系统如何存储行尾标记。
基于Windows的操作系统,由于他们的DOS遗产,存储作为一对字符的0x0D0A
– 0x0D0A
(回车+换行)。 基于Unix的操作系统只使用0x0A
(一个换行符 )。 您看到的^M
是一个0x0D
的视觉表示( 回车 )。
dos2unix将帮助这一点。 您可能还需要将脚本的来源调整为“Unix友好”。
最简单的方法是使用vi
。 我知道这听起来很糟糕,但它很简单,并且已经安装在大多数UNIX环境中。 ^ M是来自Windows / DOS环境的新行。
从命令提示符: $ vi filename
然后按“ :
”进入命令模式。
全部search和全部replace为:%s/^M//g
按住控制键,然后按V然后按M键 ,这将replace^ M。
然后写入并退出input“ :wq
”完成!
尝试使用dos2unix去除^ M。
在vi中,做一个:%s/^M//g
要获得^M
按住CTRL键,按V然后按M (两者都按住控制键),然后出现^M
这将find所有的事件,并取而代之的是什么。
SQL脚本最初是在Windows操作系统上创build的。 '^ M'字符是Windows和Unix对于用于行尾字符的结果不同的结果。 你可以在命令行使用perl来解决这个问题。
perl -pie 's/\r//g' filename.txt
^ M通常是由Windows操作符换行引起的,并且转换成Unix看起来像^ M。 命令dos2unix应该很好地删除它们
dos2unix [options] [-c convmode] [-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编辑器中replace^ 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到dos:
sed 's/$/\r/' unix.txt > dos.txt
将DOS / Windows(\ r \ n)行结尾转换为Unix(\ n)行尾,tr:
tr '\r\n' '\n' < dosFile.txt > unixFile.txt
发布有关从Unix命令行中replace新行的信息
od -a $file
对于在Linux上探索这些types的问题非常有用(类似于上面的dumphex)。
在Perl中,如果你不想设置$ /variables并使用chomp(),你也可以这样做:
$var =~ /\r\n//g;
我的两分钱
您可以直接通过sed命令从文件中删除^ M,例如:
sed -i'.bak' s/\r//g *.*
如果您对更改感到满意,请删除.bak文件:
rm -v *.bak
另一个vi命令将执行:: :%s/.$//
这将删除文件中每行的最后一个字符。 这个search和replace命令的缺点是它不关心最后一个字符是什么,所以要小心不要调用它两次。