如何将 vim 打开的文件中的 ^M 换行符转换为“正常”换行符?
-
03-07-2019 - |
题
vim 显示在每一行以 ^M 结尾
我该如何用“正常”换行符替换它?
解决方案
其他提示
命令
:%s/<Ctrl-V><Ctrl-M>/\r/g
其中<Ctrl-V><Ctrl-M>
表示键入 Ctrl + V 然后 Ctrl + M 。
点击
结果
解释
:%s
替代,%=所有行
<Ctrl-V><Ctrl-M>
^ M个字符(Ctrl-V是Vim写入Ctrl ^字符的方式,Ctrl-M在正则表达式后写入M,产生^ M特殊字符)
/\r/
使用新行(\r
)
g
全局(不仅仅是第一次出现)。
在Linux和Mac OS上,以下工作,
:%s/^V^M/^V^M/g
其中^V^M
表示键入 Ctrl + V ,然后 Ctrl + M 。
注意:在Windows上,您可能希望使用^Q
而不是^V
,因为默认情况下<=>会映射到粘贴文本。
在vim
中,查看文件格式<!>#8212; DOS或Unix:
:set filetype=unix
:set fileformat=unix
将回写文件而不回车(CR,^ M)字符。
我在 MacVim 中看到的使用BBEdit创建的文件显示了一堆^M
行返回而不是常规行。以下字符串替换解决了这个问题 - 希望这会有所帮助:
:%s/\r/\r/g
这很有意思,因为我用相同的字符替换换行符,但我想Vim只需要一个新的\ r来正确显示。我有兴趣了解其原因的基本机制。
首先,使用:set ff?
来确定文件的文件格式。
我想它可能是unix
,然后问题是你的文件是用fileformat=dos
添加<!>来创建的; ^ M ^ J <!> quot;到行尾,但只读flieformat=unix
只删除<!>“^ J <!>”;从行结束,留下<!>“^ M <!>”;那里。
只需在Vim命令行中输入:e ++ff=dos
,即可将文件的格式从unix更改为dos。它应该解决问题。如果没有,:%s/\r//g
应该帮助你。
为了使^ M字符匹配,我必须在视觉上选择它,然后使用OS copy to clipboard命令来检索它。您可以在尝试替换命令之前通过搜索字符来测试它。
/^M
应该选择第一个坏线
:%s/^M/\r/g
将用回车代替所有错误的^ M.
这是MacVim中的功能,它基于gvim 7。
<强> 编辑: 强>
在我的Windows 10计算机上再次出现此问题,该计算机具有Ubuntu for Windows,我认为这会导致vim的文件格式问题。在这种情况下,将ff更改为unix,mac或dos只会将^ M更改为^ J并再次返回。
这种情况下的解决方案:
:%s/\r$/ /g
:%s/ $//g
我走这条路的原因是因为我想确保我对我的文件没有破坏性。我可以:%s/\r$//g
但是这会立即删除回车,并且可能会有意想不到的结果。相反,我们将单个CR字符(这里是一个^ M字符)转换为空格,然后删除行尾的所有空格(无论如何,这对我来说都是理想的结果)
很抱歉恢复了一个早已被回答的旧问题,但似乎有一些混乱,我认为我会帮助澄清其中的一些,因为谷歌搜索中的这个问题很高。
这些都不适合我,所以我尝试了这个,它起作用了:
输入:%s/
按 CTRL-V CTRL-M
输入//g
按输入
所以Vim中的整体命令看起来像是:%s/^M//g
这是做什么的::%s
(查找和替换)/^M/
(该符号)/
(没有字符)g
(全局)。
无需使用Ctrl:
:%s/\r$//
对我有用的简单事情
dos2unix filename
我用sed做了这个:
sed -i -e 's/\r/\n/g' filename
^ M由 Ctrl + V 和 M 检索,所以
s/^M//g
只是:
:%s/\r//g
这完全适合我。
这样做只是为了清理所有行的行尾,它会删除^ M,就是它。
Ctrl + M 最小化我的窗口,但 Ctrl + Enter 实际上插入了一个^M
字符。我还必须确保不要在按下之间取消 Ctrl 键。
所以我的解决方案是:
:%s/<Ctrl-V><Ctrl-Enter>/\r/g
<Ctrl-V><Ctrl-Enter>
表示按住 Ctrl ,按下并释放 V ,按下并释放 Enter ,然后发布 Ctrl 。
如果您正在处理Windows生成的文件
上述解决方案将在现有行之间添加一条额外的行,因为在\r
之后已经有一个不可见的%
。
为防止出现这种情况,您需要删除s
字符而不替换它们。
:%s/<Ctrl-V><Ctrl-Enter>//g
其中/
表示<!>“;在此缓冲区中,<!>”; //
表示<!> quot; substitute,<!> quot; g
表示<!>“;(找到)以下模式,<!> quot; <=>是指按下以获取<=>字符的键(见上文),<=>表示<!>“;没有任何<!>”; (或者,<!>;带有这两个斜杠之间的模式,它是空的<!>“;),<=>是标志,意思是<!>”;全局,<! > QUOT;而不是第一次出现在一条线上。
这个问题还有很多其他答案,但以下内容仍然最适合我,因为我需要一个命令行解决方案:
vim -u NONE -c 'e ++ff=dos' -c 'w ++ff=unix' -c q myfile
解释:
- 不加载任何 .vimrc 文件,打开
myfile
- 跑步
:e ++ff=dos
强制重新加载整个文件作为 dos 行结尾。 - 跑步
:w ++ff=unix
使用 unix 行结尾写入文件 - 退出 vim
这对我有用:
- 将文件格式设置为unix(
\n
行结尾) - 保存文件 醇>
所以在vim中:
:set ff=unix
:w
就我而言,
上面没有任何工作,我有一个CSV文件从我的mac复制到Linux机器上,我使用了上述所有命令,但没有任何帮助,但下面的一个
tr "\015" "\n" < inputfile > outputfile
我有一个文件,其中^ M个字符在下面的行之间被切换了
Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKT6TG,TRO_WBFB_500,Trico,CARS,Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKTG0A,TRO_WB_T500,Trico,
或者,有一些名为dos2unix和unix2dos的开源实用程序可以执行此操作。在Linux系统上,它们可能默认安装;对于Windows系统,您可以从 http://www.bastet.com/ 等下载它们。
sed s/^M//g file1.txt > file2.txt
其中^ M是通过同时按下3个键来键入的, ctrl + v + m
如果文件是在Windows上创建的,请使用dos2unix实用程序, 如果文件是在mac上创建的,请使用mac2unix实用程序。 :)
这对我有用:
:% s/\r\n/\r
要保存击键,您可以避免输入 Ctrl + V Ctrl + M 将其放在映射中。只需打开一个包含^ M字符的文件,将其拉出,并将其粘贴到.vimrc中的这样的行中:
nnoremap <Leader>d :%s/^M//g<CR>
这些建议都不适用于我在使用vim和eclipse时设法获得大量^M
换行符。我怀疑我遇到了一个外部案件但是如果它对我做的任何人都有帮助。
:%s/.$//g
它解决了我的问题
:g/^M/s// /g
如果您使用^M
键入Shift+6 Caps+M
,则不接受。
您需要输入ctrl+v ctrl+m
。
^M
会产生不需要的换行符。为了解决这个问题,我们可以使用sed
命令,如下所示:
sed 's/\r//g'
只需删除.vimrc中的set binary
!
使用以下命令之一:
:%s/\r//g
或者
:%s/\r\(\n\)/\1/g
QUOT;此功能保留跳转列表
fun! Dos2unixFunction()
let _s=@/
let l = line(".")
let c = col(".")
try
set ff=unix
w!
"%s/\%x0d$//e
catch /E32:/
echo "Sorry, the file is not saved."
endtry
let @/=_s
call cursor(l, c)
endfun
com! Dos2Unix keepjumps call Dos2unixFunction()
我花了一个下午的努力与\ n ctrl-v 012(两者都为我提供null)。 <!>安培;通过这个线程努力工作直到我到达metagrapher's。
\r
对我来说很好!
/),/s/),/)\r/g
变成了这样的东西:
blacklist-extra:i386(0.4.1,0.4.1 + nmu1),libmount1:i386(2.20.1-5.1,2.20.1 -5.2),libblkid1:i386(2.20.1-5.1,2.20.1) -5.2),libapt-pkg4.12:i386(0.9.7.4,0.9.7.5),nmap:i386(6.00-0.1,6.00-0.2),libsane-common:i386(1.0.22-7.3,
这样的事情:
26 libwv-1.2-4:i386(1.2.9-3,自动)
27 openjdk-6-jre-headless:i386(6b24-1.11.4-3,自动)
28 jed:i386(0.99.19-2.1)
万。我非常感激
或者您可以使用此命令
来修复换行符,而不是使用vimfromdos <filename.txt>
希望它有所帮助!