【问题标题】:What does ^M character mean in Vim?Vim 中的 ^M 字符是什么意思?
【发布时间】:2011-08-16 03:43:52
【问题描述】:

我的 vimrc 中不断出现^M 字符,它破坏了我的配置。

【问题讨论】:

  • 顺便说一句 this 是一个很好的资源。
  • @LightnessRacesinOrbit - 嗯,它现在也可以使用表单。我已撤回我的评论,说链接已失效。
  • @LightnessRacesinOrbit 链接的镜像,目前已关闭:fifi.org/doc/vim/html/digraph.html#digraph-table
  • 在 vim 中键入 :digraphs 会显示 @LightnessRacesinOrbit 链接到的有向图。
  • 当尝试使用php替换这种字符时,试试这个preg_replace('/[\x01]/', ' ' ,$str); 希望它有帮助。

标签: unix vim


【解决方案1】:

这可能意味着你有回车(不同的操作系统使用不同的方式来表示行尾)。

使用dos2unix 修复文件或在vim中设置文件格式:

set ffs=unix,dos

【讨论】:

    【解决方案2】:

    您可以在 vim 中使用

    解决此问题
    :1,$s/^V^M//g
    

    其中 ^ 是控制字符。

    【讨论】:

    • 这并不能解释^M是什么。
    • 他并不是真的在问它是什么,而是在问如何解决它。它是一个来自 DOS 的回车符。
    • 知道它是什么。问题的标题是“Vim 中的 ^M 字符是什么意思”。
    【解决方案3】:

    Unix 使用 0xA 作为换行符。 Windows 使用两个字符的组合:0xD 0xA。 0xD 是回车符。 ^M 恰好是 vim 显示 0xD 的方式(0x0D = 13,M 是英文字母表中的第 13 个字母)。

    您可以通过运行以下命令删除所有 ^M 字符:

    :%s/^M//g
    

    ^M 的输入方法是按住 Ctrl 并键入 v,然后键入 m,然后松开 Ctrl kbd>。这有时缩写为^V^M,但请注意,您必须按照上句所述输入它,而不是按字面输入。

    这个表达式会将所有出现的^M 替换为空字符串(即什么都没有)。我用它来删除从 Windows 复制到 Unix(Solaris、Linux、OSX)的文件中的^M

    【讨论】:

    • 以防万一您在 Windows 上,Ctrl+V 可能会被映射为粘贴。如果是这种情况,默认值会将“特殊字符转义”键重新映射为 Ctrl+Q。
    • 真正的问题是为什么 Vim 有时会自动检测行尾并正确显示,而有时却不能。
    • 如果文件的行尾不匹配,您将看到 ^M 字符。使用 Tomasz 提供的命令,然后根据您的目标操作系统键入 :fileformat={unix|dos|mac}。如果只有几行没有^M 字符,您可能需要:fileformat=dos。如果您在 vim 以外的编辑器中编辑文件,请确保将其配置为匹配行尾(记事本不会这样做,但任何有信誉的编辑器如 Notepad++ 或 TextMate 都会这样做)。
    • 初学者注意vi,该命令需要手动输入。只需将其粘贴到运行 vi 的打开终端中就会导致“找不到模式”错误。
    • @bluesm 我实际上需要使用:%s/\r//g 来替换文件中的回车符。在我有一堆 ^M 字符的文件中找不到 ^V^M 模式。
    【解决方案4】:

    如果它破坏了您的配置,并且映射中需要 ^M 字符,您可以简单地将 ^M 字符替换为 <Enter> 甚至 <C-m>(都输入为简单的字符序列,因此 7 和 5 个字符,分别)。

    这是在映射中存储特殊键码的唯一推荐的、可移植的方式

    【讨论】:

      【解决方案5】:
      :%s/\r//g 
      

      今天为我工作。但我的情况可能略有不同。

      【讨论】:

      • g 选项不是必需的,每行只有一个新行。 :%s/\r// 就足够了。
      • 很可能需要 g 选项,因为回车不一定是换行符。在 Unix 模式下打开时,回车只是另一个字符,而在 Windows 模式下打开时,回车只是特殊的紧跟换行符。
      【解决方案6】:

      在 FreeBSD 中,您可以通过键入以下内容手动清除 ^M

      :%s/ Ctrl+V,然后是Ctrl+M,然后是Ctrl kbd>+M 再次。

      【讨论】:

        【解决方案7】:

        翻译新行而不是删除它:

        :%s/\r/\r/g
        

        【讨论】:

        • 这实际上应该做什么?对我来说,它看起来像是在用like代替like,我无法想象这会改变什么。我是否遗漏了一些关于语法如何在这里工作的特别之处?
        • @PlatinumAzure 我不知道为什么没有人想过回答你的问题。 \r 在搜索部分与替换部分有不同的行为。例如,请参阅stackoverflow.com/a/3834303
        • :%s/^V^M/^V^M/ghere
        • @TomD 该链接指向您正在评论的答案。
        • 对我来说,这用一个额外的换行符替换了烦人的字符。 @dlk5730 答案对我来说效果更好。即:%s/\r//g
        【解决方案8】:

        我得到了一个最初由 Mac 用户在 Windows 机器上生成的文本文件,需要使用 load data 命令将其导入 Linux MySQL 数据库。

        虽然 VIM 显示了 '^M' 字符,但上述方法都不适用于我的特定问题,数据会导入但总是以某种方式损坏。最终解决方案非常简单(经过多次挫折)。

        解决方案: 在同一个文件上执行dos2unix TWICE 就可以了!使用file 命令可以显示一路上发生的事情。

        $ file 'file.txt'
        file.txt: ASCII text, with CRLF, CR line terminators
        
        $ dos2unix 'file.txt'
        dos2unix: converting file file.txt to UNIX format ...
        $ file 'file.txt'
        file.txt: ASCII text, with CRLF line terminators
        
        $ dos2unix 'file.txt'
        dos2unix: converting file file.txt to UNIX format ...
        $ file 'file.txt'
        file.txt: ASCII text
        

        并且文件的最终版本完美地导入到数据库中。

        【讨论】:

          【解决方案9】:

          我用 sed 删除了它们:

          sed -i -e 's/\r//g' <filename>

          也可以用不同的字符串或字符替换。例如,如果没有换行符,您可以将\r 转换为\n

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

          那些sed 命令在sed 的GNU/Linux 版本上工作,但可能需要在BSD(包括macOS)上进行调整。

          【讨论】:

            【解决方案10】:

            在 Unix 中,使用 'tr' 命令可能更容易。

            cat file1.txt | tr "\r" "\n" > file2.txt
            

            【讨论】:

              【解决方案11】:

              假设你的文本文件是-file.txt,然后运行这个命令-

              dos2unix file.txt 
              

              它将文本文件从dos转换为unix格式。

              【讨论】:

              • 完美运行!
              【解决方案12】:

              我发现由于我的 Homebrew Mvim 实例设置为使用 filetype=dos,我已经污染了数周的文件。在 .vimrc 中进行了所需的更改....

              【讨论】:

                【解决方案13】:

                试试:%s/\^M// 至少这对我有用。

                【讨论】:

                  【解决方案14】:

                  如果您没有有意指定不同的 fileformat(例如,Windows 文件为 :e ++ff=unix),则目标文件可能混合了 EOL。

                  例如,如果文件的某些行以<CR><NL> 结尾,而其他行以 <NL> 结尾,而fileformat 被 Vim 自动设置为 unix 时,^M (<CR>) 会出现。 在这种情况下,fileformats(注意:还有一个额外的s)会发挥作用。详情请见:help ffs

                  【讨论】:

                    【解决方案15】:

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

                    :e ++ff=dos

                    :wq

                    【讨论】:

                    • 太棒了!这为需要它们的人保留了 DOS 行尾,并修复了阻止 Vim 正确识别 DOS 行尾的错误(我有一个文件在数千行中缺少一个 CR)。
                    猜你喜欢
                    • 2022-01-22
                    • 2018-05-07
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-12-16
                    • 1970-01-01
                    • 2017-01-03
                    • 1970-01-01
                    相关资源
                    最近更新 更多