如何在vim中打开的文件中将^ M换行符转换为“正常”换行符?

时间:2009-05-01 12:44:10

标签: vim line-breaks

vim显示在每行结尾^ M

我如何用'普通'换行符替换它?

37 个答案:

答案 0 :(得分:550)

命令

:%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

全局(不仅仅是第一次出现)。

答案 1 :(得分:411)

在Linux和Mac OS上,以下工作,

:%s/^V^M/^V^M/g

其中^V^M表示键入 Ctrl + V ,然后 Ctrl + M

注意:在Windows上,您可能希望使用^Q而不是^V,因为默认情况下^V会映射到粘贴文字。

答案 2 :(得分:182)

vim内,查看文件格式 - DOS或Unix:

:set filetype=unix

:set fileformat=unix

将回写文件而不回车(CR,^ M)字符。

答案 3 :(得分:111)

这是唯一对我有用的东西:

  

:e ++ ff = dos

http://vim.wikia.com/wiki/File_format

找到它

答案 4 :(得分:104)

我在 MacVim 中看到的使用BBEdit创建的文件显示了一堆^M行返回而不是常规返回。以下字符串替换解决了这个问题 - 希望这会有所帮助:

:%s/\r/\r/g

这很有意思,因为我用相同的字符替换换行符,但我想Vim只需要一个新的\ r来正确显示。我有兴趣了解其原因的基本机制。

答案 5 :(得分:34)

首先,使用:set ff?找出文件的文件格式。

我想它可能是unix,然后问题是您的文件是使用fileformat=dos添加“^ M ^ J”到行末端创建的,但只能使用flieformat=unix读取从行结束“^ J”,留下“^ M”。

只需在Vim命令行中输入:e ++ff=dos即可将文件格式从unix更改为dos。它应该解决问题。如果没有,:%s/\r//g应该会帮助你。

答案 6 :(得分:28)

为了使^ 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字符)转换为空格,然后删除行尾的所有空格(无论如何,这对我来说都是理想的结果)

很抱歉恢复了一个早已被回答的旧问题,但似乎有一些混乱,我认为我会帮助澄清其中的一些,因为谷歌搜索中的这个问题很高。

答案 7 :(得分:22)

这些都不适合我,所以我尝试了这个,它起作用了:

输入:%s/

CTRL-V CTRL-M

输入//g

输入

所以Vim中的整体命令看起来像:%s/^M//g

这样做::%s(查找和替换)/^M/(该符号)/(没有字符)g(全局)。

答案 8 :(得分:14)

无需使用Ctrl:     :%s/\r$//

答案 9 :(得分:12)

^ M由 Ctrl + V M 检索,所以

s/^M//g

答案 10 :(得分:12)

我用sed做了这个:

sed -i -e 's/\r/\n/g' filename

答案 11 :(得分:12)

对我有用的简单事情

dos2unix   filename

答案 12 :(得分:9)

只是: :%s/\r//g 这完全适合我。

这样做只是为了清理所有行的行尾,它会删除^ M,就是它。

答案 13 :(得分:8)

Ctrl + M 最小化我的窗口,但 Ctrl + Enter 实际上插入^M字符。我还必须确保不要在按下之间取消 Ctrl 键。

所以我的解决方案是:

:%s/<Ctrl-V><Ctrl-Enter>/\r/g

<Ctrl-V><Ctrl-Enter>表示按住 Ctrl ,按下并释放 V ,按下并释放 Enter < / kbd>,然后发布 Ctrl

如果您正在处理Windows生成的文件

上述解决方案会在现有行之间添加一条额外的行,因为在\r之后已经有一个不可见的^M

要防止出现这种情况,您需要删除^M字符而不替换它们。

:%s/<Ctrl-V><Ctrl-Enter>//g

%表示“在此缓冲区中”,s表示“替换”,/表示“(查找)以下模式,”<Ctrl-V><Ctrl-Enter>表示键按下以获取^M字符(见上文),//表示“无所事事”(或“,这两个斜线之间的模式为空”)和g是一个标志,意思是“全局”,而不是第一次出现在一行中。

答案 14 :(得分:8)

这个问题有很多其他答案,但是,以下对我来说最有效,因为我需要一个命令行解决方案:

vim -u NONE -c 'e ++ff=dos' -c 'w ++ff=unix' -c q myfile

说明:

  • 如果不加载任何.vimrc文件,请打开myfile
  • 运行:e ++ff=dos强制重新加载整个文件作为dos行结尾。
  • 使用unix line endings
  • 运行:w ++ff=unix以编写文件
  • 退出vim

答案 15 :(得分:7)

这对我有用:

  1. 将文件格式设置为unix(\n行结尾)
  2. 保存文件
  3. 所以在vim中:

    :set ff=unix
    :w
    

答案 16 :(得分:7)

就我而言,

上面没有任何工作,我有一个CSV文件从我的mac复制到Linux机器上,我使用了上述所有命令,但没有任何帮助,但下面的一个

Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKT6TG,TRO_WBFB_500,Trico,CARS,Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKTG0A,TRO_WB_T500,Trico,

我有一个文件,其中^ M个字符在下面的行之间被切换了

var rot = new CSapROTWrapper().GetROTEntry("SAPGUI");

答案 17 :(得分:5)

sed s/^M//g file1.txt > file2.txt

其中^ M是通过同时按下3个键来键入的, ctrl + v + m

答案 18 :(得分:5)

或者,有一些名为dos2unix和unix2dos的开源实用程序可以执行此操作。在Linux系统上,它们可能默认安装;对于Windows系统,您可以从http://www.bastet.com/等下载它们。

答案 19 :(得分:4)

如果文件是在Windows上创建的,请使用dos2unix实用程序, 如果文件是在mac上创建的,请使用mac2unix实用程序。 :)

答案 20 :(得分:2)

这对我有用:

:% s/\r\n/\r

答案 21 :(得分:1)

只需删除.vimrc中的set binary

答案 22 :(得分:1)

在使用vim和eclipse时,这些建议都没有为我设法获得^M换行符。我怀疑我遇到了一个外部案件但是如果它对我做的任何人都有帮助。

:%s/.$//g

它解决了我的问题

答案 23 :(得分:1)

保存击键,您可以避免输入 Ctrl + V Ctrl + M 将其放在映射中。只需打开一个包含^ M字符的文件,将其拉出来,然后将其粘贴到.vimrc中的这一行:

nnoremap <Leader>d :%s/^M//g<CR>

答案 24 :(得分:1)

:g/^M/s// /g

如果您使用^M键入Shift+6 Caps+M,则不会接受。

您需要输入ctrl+v ctrl+m

答案 25 :(得分:1)

使用以下命令之一:

:%s/\r//g

或者

:%s/\r\(\n\)/\1/g

答案 26 :(得分:1)

^M会产生不必要的换行符。为了解决这个问题,我们可以使用sed命令,如下所示:

sed 's/\r//g'

答案 27 :(得分:0)

要在MacOS上使用sed,请执行以下操作:

sed -i.bak $'s/\r//' <filename>

说明::此处的$'STRING'语法与bash shell有关。 Mac不会将\r视为特殊字符。通过引用$''中的命令字符串,您是在告诉外壳程序用ANSI-C标准中指定的实际\r字符替换\r

答案 28 :(得分:0)

在Solaris上:

:%s​​ / // g

即:

:%s​​ / ^ M // g

这意味着:

  • %=所有行,
  • s =替代品,
  • ^ M =您想要替代的东西
  • // =不作任何替换
  • g =全局(不仅是第一次出现)

答案 29 :(得分:0)

在VIM的命令模式下:

:e ++ff=dos | setl ff=unix | up

e ++ff=dos-强制以dos格式打开文件。

setl ff=unix-将文件转换为unix格式。

up-仅在修改后保存文件。

答案 30 :(得分:0)

在串行控制台上,所有vi和sed解决方案都不适用于我。我必须:

cat inputfilename | tr -d '\r' > outputfilename

答案 31 :(得分:0)

以上都不适合我。 (替换\ r,^ M,ctrl-v-ctrl-m) 我使用复制和粘贴将我的文本粘贴到一个新文件中。

如果你有干扰的宏,你可以在粘贴操作之前尝试:set paste,然后在:set nopaste之后尝试。{/ p>

答案 32 :(得分:0)

或者您可以使用此命令

来修复换行符,而不是使用vim
fromdos <filename.txt>

希望它有所帮助!

答案 33 :(得分:0)

我花了一个下午的努力与\ 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)

万。我非常感激

答案 34 :(得分:0)

“此功能保留跳转列表

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()

答案 35 :(得分:-1)

在Windows中,请尝试:%s/<C-Q><C-M>/g

答案 36 :(得分:-1)

在vim中,使用命令:

  

:%S / \ r \ N / \ R / G

您要搜索和替换的位置:

  

\ r \ n

  

\ r

  

/克

适用于全球

请注意,这与@ContextSwitch的答案相同,但带有gobal标志