行末出现'^M'字符

104

当我在Unix环境下运行特定的SQL脚本时,我会看到每行末尾输出到命令行上的SQL脚本都有一个'^M'字符。
我不知道这个SQL脚本最初是在哪个操作系统上创建的。

这是什么原因造成的?如何解决这个问题?

17个回答

4

要在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)

你的最后一行是我在所有之前的答案中所缺失的。我一直得到“没有找到匹配项”,因为我一直在按shift+6,所以我做了每个黑客都会做的事情,并用自己的解决方案规避了我的误解:记录一个宏来执行$以到达每行的末尾,然后按x,只需重复宏文件中的行数即可。 - darethas

1

1
您可以通过sed命令直接从文件中删除^M,例如:
sed -i'.bak' s/\r//g *.*

如果您对更改满意,请删除.bak文件:
rm -v *.bak

0

就像已经解释的那样,Windows程序喜欢用CRLF\r\n来结束行,而不是Unix/Linux标准的 \n。由于我不需要dos2unix的所有功能,所以我在我的~/.bashrc中添加了以下内容,以便删除\r

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

现在,当我想要摆脱那些由 Excel 或 Calc 导出 CSV 文件时创建的 ^M 字符时,我只需要执行以下操作:

win2unix filename.csv

当然,您也可以使用sed或其他一些工具。顺便说一句,我使用cat -e $filename来可视化^M的结尾。


0

od -a $file 在Linux上非常有用,可以用来探索这些类型的问题(类似于上面的dumphex)。


0
在Perl中,如果您不想设置$ /变量并使用chomp(),您也可以执行以下操作:
$var =~ /\r\n//g;

我的两分钱


-1

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


如果您知道它不可靠,为什么要提及它呢? - minexew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接