'^M' 行尾字符

发布于 2024-07-04 21:26:02 字数 132 浏览 12 评论 0原文

当我在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(17

笨笨の傻瓜 2024-07-11 21:26:03

另一个 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.

很快妥协 2024-07-11 21:26:03

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

od -a $file is useful to explore those types of question on Linux (similar to dumphex in the above).

篱下浅笙歌 2024-07-11 21:26:03

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

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

我的两分钱

In Perl, if you don't want to set the $/ variable and use chomp() you can also do:

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

My two cents

西瓜 2024-07-11 21:26:03

正如已经解释的,Windows程序喜欢用CRLF来终止行,即\r \n 而不是 Unix/Linux 标准 \n。 由于我不需要 dos2unix 的所有功能,因此我通过将以下内容添加到我的 ~/.bashrc 中来替换它,这删除了 ​​\r

function win2unix() {
    tmp=$(mktemp) && tr -d '\r' < $1 > $tmp && mv $tmp $1
}

现在,当我想删除创建的 ^M 字符时,例如,当我从 Excel 或 Calc 导出 CSV 文件时,我可以执行以下操作:

win2unix filename.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 of dos2unix I replaced it by adding the following to my ~/.bashrc which removes the \r:

function win2unix() {
    tmp=$(mktemp) && tr -d '\r' < $1 > $tmp && mv $tmp $1
}

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:

win2unix filename.csv

You could also use sed or something else, of course. By the way, I use cat -e $filename to visualize the ^M endings.

时光病人 2024-07-11 21:26:03

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

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

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

rm -v *.bak

You can remove ^M from the files directly via sed command, e.g.:

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

If you're happy with the changes, remove the .bak files:

rm -v *.bak
皓月长歌 2024-07-11 21:26:03

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

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

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

Convert DOS/Windows (\r\n) line endings to Unix (\n) line endings, with tr:

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

Post about replacing newlines from the Unix command line

神妖 2024-07-11 21:26:03

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

例如,
dos 到 unix:

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

unix 到 dos:

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

An alternative to dos2unix command would be using standard utilities like sed.

For example,
dos to unix:

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

unix to dos:

sed 's/$/\r/' unix.txt > dos.txt
眼眸里的那抹悲凉 2024-07-11 21:26:03

要在 vi 编辑器中替换 ^M 字符,请使用下面的

命令打开文本文件 t1.txt

vi t1.txt

shift + : 进入命令模式

,然后按上述按键 %s/^M/\r/克

in above ^M is not (shift + 6)M instead it is (ctrl + V)(ctrl + M)

To replace ^M characters in vi editor use below

open the text file say t1.txt

vi t1.txt

Enter command mode by pressing shift + :

then press keys as mentioned %s/^M/\r/g

in above ^M is not (shift + 6)M instead it is (ctrl + V)(ctrl + M)
云醉月微眠 2024-07-11 21:26:03

^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 ...]

深海夜未眠 2024-07-11 21:26:03
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.  
C:\tmp\text>dos2unix hello.txt helloUNIX.txt

Sed is even more widely available and can do this kind of thing also if dos2unix is not installed

C:\tmp\text>sed s/\r// hello.txt > helloUNIX.txt  

You could also try tr:

cat hello.txt | tr -d \r > helloUNIX2.txt  

Here are the results:

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.  
情魔剑神 2024-07-11 21:26:03

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

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

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.

perl -pie 's/\r//g' filename.txt
别把无礼当个性 2024-07-11 21:26:03

在 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.

虐人心 2024-07-11 21:26:03

尝试使用 dos2unix 去掉 ^M。

Try using dos2unix to strip off the ^M.

花海 2024-07-11 21:26:03

最简单的方法是使用 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 but its 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 then
M
" which will replace ^M with nothing.

Then to write and quit enter ":wq" Done!

旧伤还要旧人安 2024-07-11 21:26:03

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

基于 Windows 的操作系统,由于其 DOS 传统,将行尾存储为一对字符 - 0x0D0A(回车 + 换行)。 基于 Unix 的操作系统仅使用 0x0A换行)。 您看到的 ^M0x0D 的视觉表示(回车符)。

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 use 0x0A (a line feed). The ^M you're seeing is a visual representation of 0x0D (a carriage return).

dos2unix will help with this. You probably also need to adjust the source of the scripts to be 'Unix-friendly'.

歌枕肩 2024-07-11 21:26:02

这是由 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.

等往事风中吹 2024-07-11 21:26:02

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

:set fileformat=unix

:w

Fix line endings in vi by running the following:

:set fileformat=unix

:w

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文