Chr*_*urm 245 vim special-characters
当我在 Vim 中打开文件时,我看到奇怪的^M
字符。
不幸的是,世界上最受欢迎的搜索引擎对查询中的特殊字符表现不佳,所以我在这里问:
这是什么^M
性格?
怎么可能到了那里?
我该如何摆脱它?
lar*_*sks 169
该^M
是一个回车符。如果你看到这个,你可能正在看一个起源于 DOS/Windows 世界的文件,其中行尾由回车/换行符对标记,而在 Unix 世界中,行尾由单个换行符标记。
本文讨论如何设置 vim 以透明地编辑具有不同行尾标记的文件。
如果^M
在某些行的末尾有一个文件,并且您想删除它们,请在 Vim 中使用它:
:s/^M$//
Run Code Online (Sandbox Code Playgroud)
(按Ctrl+ V Ctrl+M以插入^M
。)
小智 77
一种更简单的方法是使用以下命令:
dos2unix filename
Run Code Online (Sandbox Code Playgroud)
此命令也适用于路径模式,例如
dos2unix path/name*
Run Code Online (Sandbox Code Playgroud)
如果它不起作用,请尝试使用不同的模式:
dos2unix -c mac filename
Run Code Online (Sandbox Code Playgroud)
-c
设置转换模式。凡CONVMODE是一个:ascii, 7bit, iso, mac
有ascii
是默认值。Str*_*ker 67
这对我有用
:e ++ff=dos
Run Code Online (Sandbox Code Playgroud)
:e ++ff=dos 命令告诉 Vim 再次读取文件,强制使用 dos 文件格式。Vim 将删除 CRLF 和 LF-only 行尾,只在缓冲区中留下每一行的文本。
然后
:set ff=unix
Run Code Online (Sandbox Code Playgroud)
最后
:wq
Run Code Online (Sandbox Code Playgroud)
Joh*_*han 11
摆脱回车的另一种方法是使用tr
命令。
我有一个看起来像这样的小脚本
#!/bin/sh
tmpfile=$(mktemp)
tr -d '\r' <"$1" >"$tmpfile"
mv "$tmpfile" "$1"
Run Code Online (Sandbox Code Playgroud)
您可以使用以下方法清理它sed
:
sed -e 's/^M$//' < infile > outfile
Run Code Online (Sandbox Code Playgroud)
诀窍是如何正确输入回车符。通常,您需要键入C-v C-m
以输入文字回车符。您还可以使用 sed 进行工作
sed -i.bak -e 's/^M$//' infile
Run Code Online (Sandbox Code Playgroud)
sed 就地解决方案,无需键入特殊字符(您可以复制它并且它可以工作):
sed -i -e "s/\r//g" filename
Run Code Online (Sandbox Code Playgroud)
解释:
-i: in-place
-e: regular expression
\r: escaped carriage return
/g: replace globally
Run Code Online (Sandbox Code Playgroud)
这是什么^M?
^M 是回车符。如果你看到这个,你可能正在看一个起源于 DOS/Windows 世界的文件,其中行尾由回车/换行符对标记,而在 Unix 世界中,行尾由单个换行符标记。
怎么可能到了那里?
当文件格式发生变化时。
我该如何摆脱它?
打开你的文件
vim -b FILE_PATH
Run Code Online (Sandbox Code Playgroud)
使用以下命令保存
:%s/^M//g
Run Code Online (Sandbox Code Playgroud)