vim显示在每行结尾^ M
我怎么做用'正常'换行符替换它?
-
可能重复的转换DOS行结尾到vim中的Linux行结尾
-
请将解决方案更改为fileformat更改,因为这是最干净的解决方案。
-
我知道这个问题是关于vim的,但其他一些谷歌搜索也在这个帖子中。 因此,如果您在系统上安装了Eclipse,则只需单击几下即可为单个文件或文件的完整文件夹树转换行分隔符:stackoverflow.com/a/7019737/1364747
命令
1 2
| :%s/<Ctrl-V><Ctrl-M>/
/g |
其中表示类型为Ctrl + V,然后是Ctrl + M。
说明
替代,%=所有行
^ M个字符(Ctrl-V是Vim写入Ctrl ^字符的方式,Ctrl-M在正则表达式后写入M,产生^ M特殊字符)
用新行(
)
并在全球范围内进行(不仅仅是第一次出现在线上)。
-
@luckytaxi - 它对你有什么用?
-
它删除了^ M个字符,但没有插入回车符。
-
这不起作用
-
这不起作用,至少在Ubuntu上是这样。我收到错误E486: Pattern not found:
-
我实际输入了字符串' '。你的意思是输入Ctrl + V,然后输入Ctrl + M?
-
@jumpnett - 您需要按下键和弦Ctrl-V / Ctrl-M,而不是将其作为逐字文本输入。
-
当我遇到这个问题时,这是正确的解决方案。虽然它并不那么简单。如果文件具有CRLF结尾,则此方法有效;而如果从一个文件转换为另一个,则%s / ^ V ^ M / ^ V ^ M / g方法有效。打开文件以及Git在后台更新文件时的设置可能会影响这一点,因为Vim可能在打开文件时猜测模式,但如果文件在打开时更改,则会读取所有内容。
-
失败,现在我有一个单行文件
-
适用于RHEL6.4 :)
-
在ArchLinux中为我工作:-),Vim 7.3
-
对于这个问题,这绝对是正确的答案,如果你有一个^ M后跟一个新行,你想保留换行符但是删除^ M.执行下面的其他替换会使文件重复间隔。
-
如果您仍然缺少回车符(即^ M已被删除,但所有内容都包裹在一行上),请执行::%s//
/g(其中 r n用换行符替换^ M)。
-
如果您在Windows上运行Vim,则需要使用而不是。
-
对我来说,使用MacVim @ netpoetica的解决方案是在这里唯一有效的解决方案。
-
OP表示替换,而不是删除。
-
确保实际按Ctrl-V和Ctrl-M而不是复制和粘贴字符串。
-
我总是忘记如何做到这一点,并且在我去寻找时总是回到这个问题上。谢谢你的第18次。
-
这个答案应该是我的主页
-
我希望我能够更多地投票。
-
在处理被Windows损坏的文本文件时,我只需要用"(空字符串)替换^ M.
-
继续@GrandAdmiral:Windows上的GVim找不到^M,但它找到了^M$!?!?例如::%s/^M$//g为我工作
-
如果你只想删除^ M::%s//g。另外我发现/g不是必需的(gvim,windows)
-
请注意,如果文件作为dos文件加载,则不起作用。
-
只有这对我有用。如果您不想要新行,请不要添加 r n。 :%s///g
-
这个答案为我的文件添加了额外的换行符...接受的答案工作正常。 :e ++ff=dos
在Linux和Mac OS上,以下工作,
其中^V^M表示类型为Ctrl + V,然后是Ctrl + M。
注意:在Windows上,您可能希望使用^Q而不是^V,因为默认情况下^V会映射到粘贴文本。 sub>
-
为什么这会得到一个downvote?它可以工作,即使你的文件被捣碎到一行,因为它的行末端是错误的。
-
它确实有效,正是您所有文本在一行上时所需要的。
-
不应该%s / ^ V ^ M / ^ V ^ M / g是%s / ^ V ^ M // g?
-
不。我的方法是用正确的行结束替换文件中的行尾。
-
接受的答案是不正确的。这个更好用。
-
这不起作用,至少在Ubuntu上是这样。我收到错误E486: Pattern not found: ^V^M。
-
@jumpnett,你输入不对。冒号,然后百分比,然后s,然后斜线,然后控制v,然后控制m,然后斜线,然后控制v,然后控制m,然后斜线,然后g,然后返回。
-
我没记错。它确实取代了^M,但它也增加了一个额外的换行符。我想要的是:%s/^V^M//g,但那里既不存在,因为我没有问过这个问题。
-
这适用于Ubuntu 10.04.4 LTS。
-
如果您的文件似乎根本没有换行符(即它是一条长行),这是正确的解决方案。如果您的文件似乎有行结尾和^ M字符,那么这将在每行之间添加额外的换行符。
-
@Leo,这个问题特别要求将^ M转换为换行符,这就是我的答案所做的(与接受的答案不同,它会删除^ M)。
-
@PaulTomblin是的,你说得对。道歉。我遇到的问题略有不同 - ^ M出现在git diff但不出现在Vim中,因为当文件打开时转换。我不得不将Jonathan Leffler的答案与你和LeopardSkinPillBoxHat一起使用来解决各种文件。也许我应该问一个新的问题,但是上次我这样做了一点点变化,我被告知这是一个骗局!
-
@PaulTomblin - 你的答案适用于一条带有^ M的长行。如果有很多行,每行以^ M结尾,则接受的答案有效,因为它们实际上是回车/换行对。
-
@LavaSlider,我的经验是它适用于任何行数的文件。
-
但是如果该行以" "结束,则":%s / ^ V ^ M / ^ V ^ M / g"将其更改为" ",插入空行。也许是vim的不同版本,但是我输入了:hello ^ V ^ Mhow ^ V ^ Mare ^ V ^ Myou ^ V ^ M [返回]你好^ V ^ M [返回]如何^ V ^ M [返回]是^ V ^ M [return]你^ V ^ M [esc](其中[return]命中return / enter键,[esc]是转义键)。在执行命令之前,文件有5行,第一行有"hello ^ Mhow ^ Mare ^ Myou ^ M",接下来的四行有一个单词后跟"^ M"。在":%s / ^ V ^ M / ^ V ^ M / g"之后有13行,每行1个字,除了第5,7,9,11和5行的空行。 13(在Mac上)。试试吧。
-
这不是我从真实文件从Windows迁移到Linux或Windows到Mac的经验。
-
这个适用于我,来自windows的文件,在osx上编辑,问题是,为什么这个工作,它有点奇怪不是它,用相同的字符序列替换。
-
当你的文件中没有新行时,这是一个不同的问题,我承认这是更常见的。 FYI ^ M可以与 r匹配
-
这是一个非常神秘的命令,但它在Mac上适用于我。
-
确实非常神秘,并且在我从redhat,ubuntu到os x尝试过的每台服务器上都能为我工作。
-
是的!也适用于cygwin。我在Ubuntu上创建了一个文件/ scp'ed到Windows /在Cygwin下用vim打开。它有一条长线,里面有1660 ^ M。运行此命令给出:1660 substitutions on 1 line,文件现在有1661行。好极了!
-
这是正确答案,而不是已被接受的答案。
-
我发现等效的%s/
/
/g在MacVim上运行良好,文件只显示行末尾的^M(MacVim术语中的一个长行)。显然 r n表示模式与此命令的替换部分不同。
-
这就像魅力!在OSX + vim上。 :) 非常感谢。非常讨厌在文件中有^ M.
-
在Windows上使用^ Q的提示应该额外获得+1000点!谢谢。
-
这对我没有用,但RichVel评论%s / r / r / g对我有用。很想看到答案解释为什么这个答案不起作用,但是 r确实(以及人们提出的另一种解决方案)。这个问题有很多不同的解决方案,并且不了解正在发生的事情,在事情发生之前尝试所有事情。
在vim中,查看文件格式 - DOS或Unix:
:set filetype=unix S>
:set fileformat=unix
该文件将被回写而没有回车符(CR,^ M)字符。
-
use:set fileformat = unix对于大多数配置,filetype仅更改正在使用的语法类型。
-
这修复了我遇到的错误... Vim开始认为我的UNIX格式文件是windows,新更改的行在git diff中显示^ M.
-
必须依赖于系统。今天,这个工作。 set命令在vim,btw中完成。
-
小问题我发现:如果Git在后台更新文件(由于结帐)并且您已将此设置为Vim在打开文件时猜到的内容之外的其他内容,则Vim在重新加载缓冲区时似乎不会重新转换。你最终会得到一堆无关紧要的角色。然后,您可以使用上面的%s / ^ V ^ M /.../ g方法之一。哪一个取决于您要转换的格式。
-
太棒了!因为fileformat是dos,把它设置为unix,没关系
-
最好的解决方案
-
这也适用于vi BTW,你可以用同样的方式做set ff=unix作为一个小快捷方式ft是filetype的快捷方式
-
@Posva:谢谢你的缩写!
-
我喜欢这个解决方案,因为我不必做我以前做的事情(a)离开vi,(b)vi -b <文件名>,(c):s / ^ M //。谢谢。
这是唯一对我有用的东西:
:e ++ff=dos
发现于:http://vim.wikia.com/wiki/File_format
-
这是唯一一个对我有用的人。
-
在Windows7 Vim7.4上工作
-
:e ++ff=dos后跟:set ff=unix会将结尾转换为合理的格式。
-
解决方案的响应对我没有用,只有@MateenUlhaq命令帮助了我。
-
我需要@ MateenUlhaq的第二个命令来提交git。
-
这在MacOS上对我有用。
我在MacVim中看到的用BBEdit创建的文件显示了一堆^M行返回而不是常规返回。以下字符串替换解决了问题 - 希望这有助于:
这很有趣,因为我用相同的字符替换换行符,但我想Vim只需要获得一个新的 r来正确显示。我有兴趣知道为什么这有效的基本机制。
-
搜索功能倾向于接受更广泛的规则来识别行尾序列。但 r n在被写为数据时具有特定含义。
-
这在Windows gVim中对我有用,可以整理出没有换行符的文件,而不是大量的^ M.
-
从本页提供的所有解决方案中,这是我从csv文件中删除^ M时唯一有效的模式。使用MacVim。
-
+1使用Mobaterm从Windows通过SSH连接到Ubuntu Trusty时也为我工作
-
因此,尽管指定
作为替换,但这似乎用
替换了所有
字符。不抱怨,这正是我想要的。太奇怪了。
-
:%s/
//g在windows'gVim中为我工作
-
这在MacVim中对我有用。
-
这个答案为我解释了为什么搜索和替换模式是相同的。我认为这没有任何效果,但在每种情况下它们的解释都不同 - 我还没有看到提到的那些。简短的回答似乎是" n已被采纳"。
首先,使用:set ff?来确定文件的文件格式。
我想它可能是unix,那么问题是你的文件是用fileformat=dos创建的,将"^ M ^ J"添加到行尾但是用flieformat=unix读取只从行尾删除"^ J",留下"^ M"。
只需在Vim命令行中输入:e ++ff=dos即可将文件格式从unix更改为dos。它应该解决问题。如果没有,:%s/
//g应该可以帮到你。
-
我必须做两件事。 :e ++ff=dos然后:set ff=unix和:w
为了使^ M字符匹配,我必须在视觉上选择它,然后使用OS副本到剪贴板命令来检索它。您可以在尝试替换命令之前通过搜索字符来测试它。
应该选择第一个坏线
将用回车替换所有错误的^ M.
这是MacVim中的功能,它基于gvim 7。
编辑:
在我的Windows 10计算机上再次出现此问题,该计算机具有Ubuntu for Windows,我认为这会导致vim的文件格式问题。在这种情况下,将ff更改为unix,mac或dos只会将^ M更改为^ J并再次返回。
在这种情况下的解决方案:
我走这条路的原因是因为我想确保我对我的文件没有破坏性。我可以拥有:%s/
$//g但是这会立即删除回车符,并且可能会产生意外结果。相反,我们将单个CR字符(此处为^ M字符)转换为空格,然后删除行末尾的所有空格(无论如何,这对我来说都是理想的结果)
很抱歉恢复了一个早已被回答的旧问题,但似乎有一些混乱,我想我会帮助清除一些,因为这在谷歌搜索中很高。
-
按ctrl-v ctrl-m也可以插入字符,fwiw。但是 r是插入正确的回车的东西。
-
这是正确的答案。如上所述,使用 来获取在命令中插入的文字^ M.
-
我同意,虽然我确信如果在原始发布时这对我有用,那么我就不会发布。 ;)
这些都不适合我,所以我尝试了这个,这有效:
输入:%s/
按CTRL-VCTRL-M
输入//g
按Enter
所以Vim中的整体命令看起来像:%s/^M//g
这样做::%s(查找和替换)/^M/(该符号)/(没有字符)g(全局)。
无需使用Ctrl:
:%s/
$//
-
谢谢......在Mac终端上工作得很好
-
这也是我这样做的方式。我只是永远不记得这个命令
-
这是删除这些结尾的推荐方法。
^ M由Ctrl + V和M检索,所以
简单的事情对我有用
我用sed做了这个:
sed -i -e 's/
/
/g' filename
-
谢谢!!!!!!!
-
你确定这个有效吗?在OSX上:sed -e 's/
/
/g' <<< 'over and over' - > oven and oven
-
是的它可以工作(我经常使用它),但是在OSX上,如果你没有安装sed的GNU版本,那么它可能无效。 Apple默认发布的sed版本与所有Linux发行版中的GNU版本大不相同(遗憾)。查看此问题的答案以获取更多帮助:stackoverflow.com/q/30003570/2062384
-
谢谢@Freedom_Ben。所以听起来这适用于GNU sed但不适用于BSD sed(如OSX上所见)。任何修复换行符的人都可能使用各种操作系统,因此明确答案何时起作用是有用的。
怎么样:
:%s/
//g
这完全适合我。
这样做只是为了清理所有行的行尾,它删除了^ M,就是这样。
这个问题有很多其他答案,但是,以下对我来说最好,因为我需要一个命令行解决方案:
1
| 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
-
谢谢! 这解决了我的问题,发现它在脚本中使用很有用
Ctrl + M最小化了我的窗口,但是Ctrl + Enter实际上插入了一个^M字符。我还必须确保不要在按下之间取下Ctrl键。
所以我的解决方案是:
1 2
| :%s/<Ctrl-V><Ctrl-Enter>/
/g |
其中表示按住Ctrl,按下并释放V,按下并释放Enter,然后释放Ctrl。
如果您正在处理Windows生成的文件
上述解决方案将在现有行之间添加一条额外的行,因为^M之后已经存在不可见的
。
要防止这种情况,您需要删除^M字符而不替换它们。
1
| :%s/<Ctrl-V><Ctrl-Enter>//g |
其中%表示"在此缓冲区中",s表示"替换",/表示"(查找)以下模式",表示按下以获取^M字符的键(请参阅上面),//表示"没有任何东西"(或"带有这两个斜线之间的模式,它是空的"),而g是一个表示"全局"的标志,而不是第一次出现在一行中。
这对我有用:
将文件格式设置为unix(
行结尾)
保存文件
所以在vim中:
-
这个是最正确的。
-
这个对我有用,而接受的答案却没有。
-
很高兴它奏效了。我遇到过同样的问题。
就我而言,
没有上面的工作,我有一个CSV文件从我的Mac复制到Linux机器,我使用了上述所有命令,但没有任何帮助,但下面的一个
1 2
| tr"\015""
" < inputfile > outputfile |
我有一个文件,其中^ M个字符在下面的行之间被切换
1
| Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKT6TG,TRO_WBFB_500,Trico,CARS,Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKTG0A,TRO_WB_T500,Trico, |
1
| sed s/^M//g file1.txt > file2.txt |
其中^ M是通过同时按下3个键来键入的,ctrl + v + m
或者,有一些名为dos2unix和unix2dos的开源实用程序可以执行此操作。在Linux系统上,它们可能默认安装;对于Windows系统,您可以从http://www.bastet.com/等下载它们。
如果文件是在Windows上创建的,请使用dos2unix实用程序,
如果文件是在mac上创建的,请使用mac2unix实用程序。 :)
-
从来没有听说过mac2unix,如果可以,我会再次投票!
-
Huray!这是要走的路!
这对我有用:
使用以下命令之一:
要么
只需删除.vimrc中的set binary即可!
-
在另一个线程中,建议使用"set binary"来摆脱新行的自动插入。
^M会产生不需要的换行符。要处理这个问题,我们可以使用sed命令,如下所示:
-
idk为什么这被低估为-1 ...因为它使用sed?你可以在vim中做同样的替换,它应该工作
在使用vim和eclipse时,这些建议都没有为我设法获得^M换行符的负载。我怀疑我遇到了一个外部案件,但万一我能帮助任何人。
它解决了我的问题
-
这将删除行尾的任何字符。如果你的某条线由于某种原因而被^ M终止,那么你也将删除该字符,并且会出乎意料。这不应该是这种情况,但如果它是,并且你不知道这一点,那么你可能会以一种非常难以识别的方式玷污你的文件。
要保存击键,可以避免键入Ctrl + VCtrl + M,方法是将其放在映射中。只需打开一个包含^ M字符的文件,将其拉出来,然后将其粘贴到.vimrc中的这样一行:
1
| nnoremap <Leader>d :%s/^M//g<CR> |
如果使用Shift+6 Caps+M键入^M,则不接受。
您需要输入ctrl+v ctrl+m。
"此函数保留跳转列表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 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() |
-
在这种情况下,使用* NIX的本机dos2unix命令有什么问题? linux.die.net/man/1/dos2unix
以上都不适合我。 (替换 r,^ M,ctrl-v-ctrl-m)
我使用复制和粘贴将我的文本粘贴到一个新文件中。
如果您有干扰的宏,可以在粘贴操作之前尝试:set paste,然后尝试:set nopaste。
或者,您可以使用此命令修复换行符,而不是使用vim
希望能帮助到你!
在串行控制台上,所有的vi和sed解决方案都不适用于我。我不得不:
1 2
| cat inputfilename | tr -d '
' > outputfilename |
在vim中,使用命令:
:%s/
/
/g
您要搜索和替换的位置:
成
和
/g
是为了全球化
请注意,这与@ContextSwitch的答案相同,但与gobal标志相同
要在MacOS上使用sed,请执行以下操作:
1 2
| sed -i.bak $'s/
//' <filename> |
说明:此处的$'STRING'语法与bash shell有关。 Mac不会将
视为特殊字符。通过引用$''中的命令字符串,您告诉shell将
替换为ANSI-C标准中指定的实际
字符。
我花了一个下午与 n ctrl-v 012挣扎(两者都为我提供了null)。 &安培;通过这个线程努力,直到我达到metagrapher的。
对我来说很好!
变成这样的东西:
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, automatic)
27 openjdk-6-jre-headless:i386 (6b24-1.11.4-3, automatic)
28 jed:i386 (0.99.19-2.1)
魔法。我非常感激
在Windows中时,请尝试:%s//g
-
你能否解释一下为什么这样可行,即你实际上对该命令的各个部分做了什么?
-
这与最佳答案相同,只是替换为,因为默认情况下,前者被映射到粘贴文本。
-
^ M表示"0d0d0a",:%s//g将"0d0d0a"更改为"0d0a"(0d0a表示 n r)。 我不知道为什么,但它确实在我的windows7操作系统中以这种方式工作(0d0d0a→0d0a,即^ M→ n r n)。