'^M' 行尾字符
当我在 Unix 环境中运行特定的 SQL 脚本时,我在 SQL 脚本的每一行末尾看到一个“^M”字符,因为它回显到命令行。
我不知道 SQL 脚本最初是在哪个操作系统上创建的。
造成这种情况的原因是什么以及如何解决?
When I run a particular SQL script in Unix environments, I see a '^M' character at the end of each line of the SQL script as it is echoed to the command line.
I don't know on which OS the SQL script was initially created.
What is causing this and how do I fix it?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(17)
另一个 vi 命令可以做到:
:%s/.$//
这会删除文件中每行的最后一个字符。 此搜索和替换命令的缺点是它不关心最后一个字符是什么,因此请小心不要调用它两次。Another vi command that'll do:
:%s/.$//
This removes the last character of each line in the file. The drawback to this search and replace command is that it doesn't care what the last character is, so be careful not to call it twice.od -a $file
对于探索 Linux 上的此类问题很有用(类似于上面的 dumphex)。od -a $file
is useful to explore those types of question on Linux (similar to dumphex in the above).在 Perl 中,如果你不想设置 $/ 变量并使用 chomp() 你也可以这样做:
我的两分钱
In Perl, if you don't want to set the $/ variable and use chomp() you can also do:
My two cents
正如已经解释的,Windows程序喜欢用CRLF来终止行,即
\r \n
而不是 Unix/Linux 标准\n
。 由于我不需要dos2unix
的所有功能,因此我通过将以下内容添加到我的~/.bashrc
中来替换它,这删除了 \r
:现在,当我想删除创建的
^M
字符时,例如,当我从 Excel 或 Calc 导出 CSV 文件时,我可以执行以下操作:您也可以使用
sed或其他东西。 顺便说一句,我使用
cat -e $filename
来可视化^M
结尾。As already explained, Windows programs like to terminate lines with CRLF, i.e.
\r\n
instead of the Unix/Linux standard\n
. Since I don't need all the features ofdos2unix
I replaced it by adding the following to my~/.bashrc
which removes the\r
:Now when I want to get rid of those
^M
characters created e.g. when I export a CSV file from Excel or Calc, I can just do something like:You could also use
sed
or something else, of course. By the way, I usecat -e $filename
to visualize the^M
endings.您可以通过 sed 命令直接从文件中删除 ^M,例如:
如果您对更改感到满意,请删除 .bak 文件:
You can remove ^M from the files directly via sed command, e.g.:
If you're happy with the changes, remove the .bak files:
将 DOS/Windows (\r\n) 行结尾转换为 Unix (\n) 行结尾,使用 tr:
有关从 Unix 命令替换换行符的帖子线
Convert DOS/Windows (\r\n) line endings to Unix (\n) line endings, with tr:
Post about replacing newlines from the Unix command line
dos2unix
命令的替代方法是使用标准实用程序,例如sed
。例如,
dos 到 unix:
unix 到 dos:
An alternative to
dos2unix
command would be using standard utilities likesed
.For example,
dos to unix:
unix to dos:
要在 vi 编辑器中替换 ^M 字符,请使用下面的
命令打开文本文件 t1.txt
按
shift + :
进入命令模式,然后按上述按键
%s/^M/\r/克
To replace ^M characters in vi editor use below
open the text file say t1.txt
Enter command mode by pressing
shift + :
then press keys as mentioned
%s/^M/\r/g
^M 通常是由 Windows 操作符换行符引起的,翻译到 Unix 上看起来像 ^M。 命令 dos2unix 应该很好地删除它们
dos2unix [options] [-c convmode] [-o file ...] [-n infile outfile ...]
The ^M is typically caused by the Windows operator newlines, and translated onto Unix looks like a ^M. The command dos2unix should remove them nicely
dos2unix [options] [-c convmode] [-o file ...] [-n infile outfile ...]
Sed 的应用范围更广,如果未安装 dos2unix 也可以执行此类操作
您也可以尝试 tr:
以下是结果:
Sed is even more widely available and can do this kind of thing also if dos2unix is not installed
You could also try tr:
Here are the results:
SQL 脚本最初是在 Windows 操作系统上创建的。 '^M' 字符是 Windows 和 Unix 对于行尾字符的使用有不同想法的结果。 您可以在命令行中使用 perl 来解决此问题。
The SQL script was originally created on a Windows OS. The '^M' characters are a result of Windows and Unix having different ideas about what to use for an end-of-line character. You can use perl at the command line to fix this.
在 vi 中,执行
:%s/^M//g
要获取
^M
,请按住 CTRL 键,然后按 V 然后 M (同时按住 Control 键)和^M
将出现。 这将找到所有出现的情况并将其替换为空。In vi, do a
:%s/^M//g
To get the
^M
hold the CTRL key, press V then M (Both while holding the control key) and the^M
will appear. This will find all occurrences and replace them with nothing.尝试使用 dos2unix 去掉 ^M。
Try using dos2unix to strip off the ^M.
最简单的方法是使用
vi
。我知道这听起来很糟糕,但是它很简单并且已经安装在大多数 UNIX 环境中。 ^M 是来自 Windows/DOS 环境的新行。从命令提示符处:
$ vi filename
然后按“
:
”进入命令模式。全局搜索并替换为
:%s/^M//g
“按住 Ctrl 键,然后按 V 键M”,它将用任何内容替换 ^M。
然后要写入并退出,请输入“
:wq
” 完成!The easiest way is to use
vi
.I know that sounds terrible butits simple and already installed on most UNIX environments. The ^M is a new line from Windows/DOS environment.from the command prompt:
$ vi filename
Then press "
:
" to get to command mode.Search and Replace all Globally is
:%s/^M//g
"Press and hold control then press V thenM" which will replace ^M with nothing.
Then to write and quit enter "
:wq
" Done!原因是基于 Windows 的操作系统和基于 Unix 的操作系统存储行结束标记的方式不同。
基于 Windows 的操作系统,由于其 DOS 传统,将行尾存储为一对字符 -
0x0D0A
(回车 + 换行)。 基于 Unix 的操作系统仅使用0x0A
(换行)。 您看到的^M
是0x0D
的视觉表示(回车符)。dos2unix 将对此有所帮助。 您可能还需要将脚本源调整为“Unix 友好”。
The cause is the difference between how a Windows-based based OS and a Unix based OS store the end-of-line markers.
Windows based operating systems, thanks to their DOS heritage, store an end-of-line as a pair of characters -
0x0D0A
(carriage return + line feed). Unix-based operating systems just use0x0A
(a line feed). The^M
you're seeing is a visual representation of0x0D
(a carriage return).dos2unix will help with this. You probably also need to adjust the source of the scripts to be 'Unix-friendly'.
这是由 DOS/Windows 行结束字符引起的。 正如 Andy Whitfield 所说,Unix 命令 dos2unix 将帮助解决这个问题。 如果您需要更多信息,可以阅读该命令的手册页。
It's caused by the DOS/Windows line-ending characters. Like Andy Whitfield said, the Unix command dos2unix will help fix the problem. If you want more information, you can read the man pages for that command.
通过运行以下命令修复
vi
中的行结尾::set fileformat=unix
:w
Fix line endings in
vi
by running the following::set fileformat=unix
:w