当我在Unix环境下运行特定的SQL脚本时,我会看到每行末尾输出到命令行上的SQL脚本都有一个'^M'字符。
我不知道这个SQL脚本最初是在哪个操作系统上创建的。
这是什么原因造成的?如何解决这个问题?
当我在Unix环境下运行特定的SQL脚本时,我会看到每行末尾输出到命令行上的SQL脚本都有一个'^M'字符。
我不知道这个SQL脚本最初是在哪个操作系统上创建的。
这是什么原因造成的?如何解决这个问题?
要在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)
使用tr将DOS/Windows(\r\n)行尾转换为Unix(\n)行尾:
tr '\r\n' '\n' < dosFile.txt > unixFile.txt
sed -i'.bak' s/\r//g *.*
rm -v *.bak
就像已经解释的那样,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
的结尾。
od -a $file
在Linux上非常有用,可以用来探索这些类型的问题(类似于上面的dumphex)。
$var =~ /\r\n//g;
我的两分钱
另一个可以使用的vi命令是::%s/.$//
。这个命令会删除文件中每一行的最后一个字符。这个搜索和替换命令的缺点是它不关心最后一个字符是什么,所以要小心不要调用两次。