【问题标题】:How to convert the ^M linebreak to 'normal' linebreak in a file opened in vim?如何将 ^M 换行符转换为在 vim 中打开的文件中的“正常”换行符?
【发布时间】:2010-10-23 02:38:12
【问题描述】:

vim 显示在以 ^M 结尾的每一行

如何用“正常”换行符替换它?

【问题讨论】:

  • 请将解决方案更改为fileformat change,因为这是最干净的解决方案。
  • 我知道这个问题是关于 vim 的,但是其他一些谷歌搜索也出现在这个线程中。因此,如果您的系统上安装了 Eclipse,您只需单击几下即可将行分隔符转换为单个文件或完整的文件文件夹树:stackoverflow.com/a/7019737/1364747
  • 我喜欢您将正常换行符称为“正常”的方式——与那些 ^M 换行符相比 :-)

标签: vim line-breaks


【解决方案1】:

命令

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

&lt;Ctrl-V&gt;&lt;Ctrl-M&gt; 表示键入 Ctrl+V,然后键入 Ctrl+M

说明

:%s

替换,% = 所有行

<Ctrl-V><Ctrl-M>

^M 字符(Ctrl-V 是 Vim 写 Ctrl ^ 字符的方式,Ctrl-M 在正则表达式后面写 M,产生 ^M 特殊字符)

/\r/

换行 (\r)

g

并在全局范围内执行(不仅仅是第一次出现)。

【讨论】:

  • 它删除了 ^M 字符但没有插入回车。
  • @jumpnett - 您需要按下和弦键 Ctrl-V/Ctrl-M,而不是逐字输入。
  • 这绝对是问题的正确答案,如果你有一个 ^M 后跟一个新行,你想保留换行但删除 ^M。执行下面的其他替换会使您的文件加倍空格。
  • 如果您仍然缺少回车符(即 ^M 已被删除,但所有内容都包裹在一行中),请执行以下操作::%s/&lt;Ctrl-V&gt;&lt;Ctrl-M&gt;/\r/g(其中 \r 将 ^M 替换为换行符)。
  • 如果你在 Windows 上运行 Vim,那么你需要使用 而不是
【解决方案2】:

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

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

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

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

【讨论】:

  • 为什么会遭到反对?它可以工作,即使你的文件因为行尾错误而被混合到一行。
  • 没有。我的方法是用正确的行尾替换文件中的行尾。
  • 当您的文件中没有新行时,这是一个不同的问题,我承认这更常见。仅供参考 ^M 可以通过 \r 匹配
  • 这是一个非常神秘的命令,但它适用于我的 mac。
  • 我发现等效的 %s/\r/\r/g 在 MacVim 上运行良好,因为文件在行尾仅显示 ^M(MacVim 术语中的一行很长)。显然 \r 在该命令的模式与替换部分中表示不同的东西。
【解决方案3】:

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

:set filetype=unix

:set fileformat=unix

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

【讨论】:

  • 使用 :set fileformat=unix 对于大多数配置文件类型只改变正在使用的语法类型。
  • 这修复了我遇到的错误... Vim 开始认为我的 UNIX 格式文件是 windows 并且新更改的行在 git diff 中显示 ^M。
  • 必须依赖于系统。今天,这个成功了。设置命令是在 vim 中完成的,顺便说一句。
  • 太棒了!因为文件格式是dos,设置成unix就可以了
  • 这也适用于 vi 顺便说一句,您可以将 set ff=unix 作为一个小快捷方式,就像 ftfiletype 的快捷方式一样
【解决方案4】:

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

:e ++ff=dos

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

【讨论】:

  • 曾在 windows7 Vim7.4 上工作
  • :e ++ff=dos 后跟 :set ff=unix 会将结尾转换为合理的格式。
  • 解决方案的响应对我不起作用,只有 @MateenUlhaq 命令帮助了我。
【解决方案5】:

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

:%s/\r/\r/g

这很有趣,因为我用相同的字符替换换行符,但我想 Vim 只需要一个新的 \r 就可以正确显示。我很想知道它为什么起作用的潜在机制。

【讨论】:

  • 搜索功能倾向于接受更广泛的规则来识别行尾序列。但是 \r 在写成数据时有特定的含义。
  • 这在 Windows gVim 中对我有用,可以整理出一个没有换行符的文件,而只是很多 ^M。
  • 在此页面上提供的所有解决方案中,这是我从 csv 文件中删除 ^M 的唯一模式。使用 MacVim。
  • +1 在使用 Mobaterm 从 Windows SSH 到 Ubuntu Trusty 时也为我工作
  • 所以,这似乎用\n 替换了所有\r 字符,尽管指定\r 作为替换。不抱怨,这正是我想要的。很奇怪。
【解决方案6】:

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

我猜可能是unix,那么问题是您的文件是使用fileformat=dos 创建的,在行尾添加“^M^J”,但读取时使用flieformat=unix 仅删除了“^J”行结束,将“^M”留在那里。

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

【讨论】:

  • 我必须同时做这两件事。 :e ++ff=dos 然后 :set ff=unix:w
【解决方案7】:

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

/^M

应该选择第一个坏行

:%s/^M/\r/g

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

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

编辑:

在我的装有 Ubuntu for Windows 的 Windows 10 机器上再次遇到此问题,我认为这会导致 vim 的文件格式问题。在这种情况下,将 ff 更改为 unix、mac 或 dos 只是将 ^M 更改为 ^J 并再次返回。

这种情况下的解决办法:

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

我走这条路的原因是因为我想确保我的文件是非破坏性的。我可以有:%s/\r$//g,但这会直接删除回车,并且可能会产生意想不到的结果。相反,我们将单个 CR 字符(此处为 ^M 字符)转换为空格,然后删除行尾的所有空格(无论如何,这对我来说都是一个理想的结果)

很抱歉重新提出了一个早已被回答的老问题,但似乎有一些混乱正在发生,我想我会帮助解决其中的一些问题,因为这在谷歌搜索中排名很高。

【讨论】:

  • 按 ctrl-v ctrl-m 也可以插入字符,fwiw。但 \r 是插入正确的回车符。
  • 这是正确的答案。如上所述,使用 获取插入到命令中的文字 ^M。
  • 我同意,但我确信如果在最初发帖时这对我有用,那么我就不会发帖了。 ;)
【解决方案8】:

这些都不适合我,所以我尝试了这个,它有效:

输入:%s/

CTRL-VCTRL-M

输入//g

回车

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

这是做什么的::%s(查找和替换)/^M/(那个符号)/(没有字符)g(全局)。

【讨论】:

  • 砰!适用于 Mac。
  • 不错的答案。只是杀死^M,但不会用换行符替换它们(vim linux,ff=dos)。 YMMV 取决于您拥有的 [mac,windows,linux] 以及当前设置的文件格式(参见:set ff?)。你在 Mac 上吗?
【解决方案9】:

^M 由 Ctrl+VM 检索,所以这样做

s/^M//g

【讨论】:

    【解决方案10】:

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

    【讨论】:

    • 这也是我的做法。我只是不记得命令
    • 这是删除这些结尾的推荐方法。
    • 这也非常适合我的情况。
    • Vim 8.1 为此给了我E486: Pattern not found: \r$
    【解决方案11】:

    对我有用的简单的东西

    dos2unix   filename
    

    【讨论】:

    • 这只是删除了 ^M 字符,而不是用换行符替换它们。
    • 这对我来说都失败了。 :%s/^M/\r/g^M 是 CTRL-'VM')工作。
    【解决方案12】:

    我是用 sed 做的:

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

    【讨论】:

    • 你确定这有效吗?在 OSX 上:sed -e 's/\r/\n/g' &lt;&lt;&lt; '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 上找到)。任何修复换行符的人都可能使用多种操作系统,因此明确答案何时有效是很有用的。
    【解决方案13】:

    只是: :%s/\r//g 这对我完全有用。

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

    【讨论】:

      【解决方案14】:

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

      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

      【讨论】:

      • 谢谢!这解决了我的问题,发现在脚本中使用它很有用
      【解决方案15】:

      Ctrl+M 最小化我的窗口,但 Ctrl+Enter 实际上插入了一个^M 字符。我还必须确保在两次按下之间不要松开 Ctrl 键。

      所以我的解决方案是:

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

      其中&lt;Ctrl-V&gt;&lt;Ctrl-Enter&gt;表示按住 Ctrl,按住V,按住Enter然后松开 Ctrl

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

      上述方案会在现有行之间多加一行,因为^M后面已经有一个不可见的\r

      为防止这种情况,您希望删除 ^M 字符而不替换它们。

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

      其中% 表示“在此缓冲区中”,s 表示“替代”,/ 表示“(查找)以下模式”,&lt;Ctrl-V&gt;&lt;Ctrl-Enter&gt; 表示要按下以获取^M 的键字符(见上文),// 表示“什么都没有”(或者,“这两个斜线之间的模式是空的”),g 是一个标志,意思是“全局, " 而不是一行中的第一次出现。

      【讨论】:

        【解决方案16】:

        这对我有用:

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

        所以在 vim 中:

        :set ff=unix
        :w
        

        【讨论】:

        • 这个对我有用,而接受的答案没有。
        【解决方案17】:

        就我而言,

        上面没有任何效果,我有一个 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,
        

        【讨论】:

          【解决方案18】:

          或者,有一些开源实用程序叫做 dos2unix 和 unix2dos 可以做这件事。在 linux 系统上,它们可能是默认安装的;对于 Windows 系统,您可以从 http://www.bastet.com/ 等处下载它们。

          【讨论】:

            【解决方案19】:
            sed s/^M//g file1.txt > file2.txt
            

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

            【讨论】:

              【解决方案20】:

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

              【讨论】:

              • 以前从未听说过 mac2unix,如果可以的话,我会再次投票!
              • 万岁!这是要走的路!
              【解决方案21】:

              使用以下命令之一:

              :%s/\r//g
              

              或者

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

              【讨论】:

              • 第一个命令只是删除所有\r,如果你像这样保存它,你的文件将被破坏。
              【解决方案22】:

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

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

              【讨论】:

                【解决方案23】:

                这对我有用:

                :% s/\r\n/\r
                

                【讨论】:

                  【解决方案24】:

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

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

                  解释:这里的$'STRING' 语法与bash shell 相关。 Mac 不会将 \r 视为特殊字符。通过引用$'' 中的命令字符串,您是在告诉shell 将\r 替换为ANSI-C 标准中指定的实际\r 字符。

                  【讨论】:

                    【解决方案25】:

                    这些建议都不适合我在使用 vim 和 eclipse 时设法获得^M 换行符的负载。我怀疑我遇到了一个外部案例,但以防万一它对我做过的任何人有所帮助。

                    :%s/.$//g
                    

                    它解决了我的问题

                    【讨论】:

                    • 这将删除行尾的任何字符。如果您有一行由于某种原因没有被 ^M 终止,那么您也将删除该字符,这将是意外的。这不应该是这种情况,但如果是这种情况,并且您不知道这一点,那么您可能会以一种非常难以识别的方式玷污您的文件。
                    【解决方案26】:
                    :g/^M/s// /g
                    

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

                    您需要输入ctrl+v ctrl+m

                    【讨论】:

                      【解决方案27】:

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

                      sed 's/\r//g'
                      

                      【讨论】:

                      • idk 为什么这被否决为 -1... 因为它使用 sed?你可以在 vim 中做同样的替换,它应该工作
                      【解决方案28】:

                      只需删除 .vimrc 中的set binary

                      【讨论】:

                      • 在另一个线程中,建议使用“set binary”来摆脱自动插入新行。
                      【解决方案29】:

                      在 Solaris 上:

                      :%s///g

                      即:

                      :%s/^M//g

                      这意味着:

                      • % = 所有行,
                      • s = 替代品,
                      • ^M = 您想要替换的内容
                      • // = 替换为空
                      • g = 全局(不仅是第一次出现)

                      【讨论】:

                        【解决方案30】:

                        在 VIM 的命令模式下:

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

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

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

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

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2010-09-09
                          • 1970-01-01
                          • 2023-03-22
                          相关资源
                          最近更新 更多