将^M (Windows)换行符转换为普通换行符

Vim在每一行结束时显示^M

我如何用在Vim中打开的文件中的普通换行符替换它?

415796 次浏览

^M是通过Ctrl+V来检索的

s/^M//g

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

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

其中^V^M表示类型Ctrl+V,然后是Ctrl+

注意:在Windows上,你可能想使用^Q而不是^V,因为默认情况下^V被映射为粘贴文本。

命令

:%s/<Ctrl-V><Ctrl-M>/\r/g
其中<Ctrl-V><Ctrl-M>表示类型Ctrl+V,然后是Ctrl+

< / p >

解释

:%s

替换,% =所有行

<Ctrl-V><Ctrl-M>

^M个字符(Ctrl- v是一种Vim方式来书写Ctrl ^字符,Ctrl-M将M写在正则表达式之后,结果是^M个特殊字符)

/\r/

使用new line (\r)

g

并且全局执行(而不仅仅是行上的第一个事件)。

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

:set filetype=unix

:set fileformat=unix

文件将被写回,没有回车符(CR, ^M)。

另外,还有称为dos2unix和unix2dos的开源实用程序可以做这件事。在linux系统上,它们可能是默认安装的;对于windows系统,你可以从http://www.bastet.com/下载它们。

为了让^M字符匹配,我必须在视觉上选择它,然后使用操作系统复制到剪贴板命令来检索它。您可以在尝试替换命令之前通过搜索字符来测试它。

/^M

应该选择第一行吗

:%s/^M/\r/g

将所有错误的^M替换为回车。

这是基于gvim 7的MacVim中的函数。

< em >编辑:< / em >

在我的Windows 10机器上又遇到了这个问题,它有Ubuntu for Windows,我认为这导致了vim的文件格式问题。在这种情况下,将ff更改为unix、mac或dos,只会将^M更改为^J,然后再更改回来。

这种情况下的解决方案:

:%s/\r$/ /g
:%s/ $//g

我这样做的原因是我想确保我的文件是无损的。我可以有:%s/\r$//g,但这将删除回车,并可能会有意想不到的结果。相反,我们将单数CR字符(这里是^M字符)转换为空格,然后删除行尾的所有空格(无论如何,这对我来说都是一个理想的结果)

很抱歉重新提出一个早已被回答的老问题,但似乎有一些困惑正在进行中,我想我可以帮助澄清一些,因为这是谷歌搜索的高。

这个函数保存跳转列表

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

首先,使用:set ff?来确定文件的格式。

我猜它可能是unix,那么问题是你的文件是用fileformat=dos在行末添加“^M^J”创建的,但用flieformat=unix只从行末删除“^J”,留下“^M”。

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

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

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

:%s/\r/\r/g

这很有趣,因为我用相同的字符替换了换行符,但我认为Vim只需要获得一个新的\r才能正确显示。我很想知道为什么这是可行的。

我花了一个下午的时间与\n ctrl-v 012作斗争(两者都为我提供null)。,吃力地从这条线索走到metagrapher的那里

\r工作对我来说很好!

/),/s/),/)\r/g

变成这样:

黑名单-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, automatic)
27 openjdk-6-jre-headless:i386 (6b24-1.11.4-3, automatic)
28 jed:i386 (0.99.19-2.1)

魔法。我深深地感激

或者不使用vim,只需使用此命令修复换行符

fromdos <filename.txt>

希望能有所帮助!

对于保存按键,你可以通过将其放在映射中来避免键入Ctrl+VCtrl+。只要打开一个包含^M字符的文件,把它拉出来,然后把它粘贴到你的.vimrc中的一行中:

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

这是唯一对我有效的方法:

: e + + ff = dos

http://vim.wikia.com/wiki/File_format找到它

这些建议对我都不起作用,因为我在使用vim和eclipse时设法获得了^M换行符。我怀疑我遇到了一个外部案件但为了能帮助到其他人。

:%s/.$//g

这解决了我的问题

这招对我很管用:

:% s/\r\n/\r

这些方法对我都不起作用,所以我尝试了这个,它起作用了:

类型:%s/

新闻ctrl - vCTRL-M

类型//g

新闻输入

因此,Vim中的整个命令应该看起来像:%s/^M//g

它的作用::%s(查找并替换)/^M/(该符号)/(不带字符)g(全局)。

那么: : % s / \ r / / g

它的作用是清除所有行的末尾,去掉^M,就是这样。

以上对我来说都没用。(替换\r, ^M, ctrl-v-ctrl-m) 我使用复制和粘贴将我的文本粘贴到一个新文件中。< / p >

如果有宏干扰,可以在粘贴操作之前尝试:set paste,在粘贴操作之后尝试:set nopaste

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

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

这对我来说很简单

dos2unix   filename

我用sed做了这个:

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

:g/^M/s// /g

如果你使用Shift+6 Caps+M输入^M,它不会接受。

你需要输入ctrl+v ctrl+m

使用以下命令之一:

:%s/\r//g

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

在vim中,使用命令:

: % s / \ r \ n \ r / g

想要搜索和替换的地方:

\ r \ n

r \

/ g

是全球性的

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

不需要使用Ctrl: :%s/\r$// < / p >

^M给出不需要的换行符。要处理这个问题,我们可以使用sed命令,如下所示:

sed 's/\r//g'

在串行控制台上,所有的vi和sed解决方案都不适合我。我不得不:

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

这招对我很管用:

  1. 设置文件格式为unix (\n行结束)
  2. 保存文件

在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,

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

Ctrl+最小化我的窗口,但Ctrl+输入实际上插入了一个^M字符。我还必须确保在按压之间不抬起Ctrl键。

所以我的解决方案是:

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

其中<Ctrl-V><Ctrl-Enter>表示按住不放 Ctrl,按下并释放V,按下并释放输入然后释放 Ctrl

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

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

为了防止这种情况,你需要删除^M字符而不替换它们。

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

其中%表示“在此缓冲区中”,s表示“替换”,/表示“(找到)下面的模式”,<Ctrl-V><Ctrl-Enter>指按下以获得^M字符的键(见上文),//表示“没有”(或者,“在这两个斜杠之间的模式,为空”),而g是一个国旗,表示“全局”,而不是一行中的第一个出现。

这个问题有很多其他的答案,但仍然,下面的最适合我,因为我需要一个命令行解决方案:

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辞职

只要在你的.vimrc中删除__abc0 !

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

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

这里的$'STRING'语法属于bash shell。mac不会将\r视为特殊字符。通过在$''中引用命令字符串,你告诉shell用ANSI-C标准中指定的实际\r字符替换\r

在Solaris:

: % s / & lt; CTRL + V> & lt; CTRL + M> / / g

那就是:

: % s / M ^ / / g

这意味着:

  • % =所有行,
  • S =代入,
  • ^M =你想要替换的东西
  • // =替换为空
  • G =全局(不仅是第一次出现)

在VIM命令模式下:

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

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

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

up -保存文件仅当已被修改。