【问题标题】:Convert DOS line endings to Linux line endings in Vim在 Vim 中将 DOS 行尾转换为 Linux 行尾
【发布时间】:2010-09-10 02:38:30
【问题描述】:

如果我打开在 Windows 中创建的文件,所有行都以 ^M 结尾。 如何一次性删除这些字符?

【问题讨论】:

  • 如果您执行hexdump -C badfile 并看到0x0d 0x0a "\r\n" 那是您的问题。

标签: linux vim file editor dos2unix


【解决方案1】:

在 VIM 中:

:e ++ff=dos | set ff=unix | w!

在带有 VIM 的 shell 中:

vim some_file.txt +'e ++ff=dos | set ff=unix | wq!'

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

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

【讨论】:

    【解决方案2】:

    dos2unix 是一个命令行实用程序,如果您使用 Ctrl-v Ctrl-:%s/^M//g 将执行此操作kbd>m 输入 ^M,或者你可以:set ff=unix,Vim 会帮你做。

    有关于fileformat 设置的文档,Vim wiki 有一个全面的page on line ending conversions

    或者,如果你经常来回移动文件,你可能不想转换它们,而是做:set ff=dos,这样 Vim 就会知道它是一个 DOS 文件,并使用 DOS 约定作为行尾。

    【讨论】:

    • :%s/^M//g 应该是:%s/\r//g,因为^M 只是表示“匹配行首的大写“M”。
    • 如果你按照答案说的那样做并'使用 ctrl-v ctrl-m 输入 ^M',则不会。
    • crtl-v 不好,在 Windows 上它将剪贴板内容粘贴到命令行。解决方案:%s/\r//g 为我工作,干杯@Bunyk
    • @ropata 在 Windows 上你想要的是ctrl-q
    • 我一定错过了什么,因为set ff=unix 什么都不做。也许它会转换文件,但所有 ^M 字符仍然存在。
    【解决方案3】:

    直接在 Linux 控制台中运行:

    vim file.txt +"set ff=unix" +wq
    

    【讨论】:

      【解决方案4】:

      在 Vim 中,输入:

      :w !dos2unix %
      

      这会将您当前缓冲区的内容通过管道传送到dos2unix 命令,并将结果写入当前内容。之后 Vim 会要求重新加载文件。

      【讨论】:

        【解决方案5】:

        我知道我在某个地方看到过这个。这是FreeBSD 登录提示:

        您需要从 DOS 文件中删除所有这些 ^M 字符吗?试试

        tr -d \\r < dosfile > newfile
            -- Originally by Dru <genesis@istar.ca>
        

        【讨论】:

          【解决方案6】:

          如果您在记事本中创建文件或在 Windows 中创建Notepad++ 文件,将其带到 Linux 并通过 Vim 打开它,您将在每一行的末尾看到 ^M。要删除它,

          在您的 Linux 终端上,键入

          dos2unix filename.ext
          

          这将发挥所需的魔力。

          【讨论】:

          【解决方案7】:

          你可以使用:

          vim somefile.txt +"%s/\r/\r/g" +wq
          

          dos2unix 实用程序。

          【讨论】:

            【解决方案8】:

            这是我的方式。我在 DOS EOL 中打开了一个文件,当我保存文件时,它会自动转换为 Unix EOL:

            autocmd BufWrite * :set ff=unix
            

            【讨论】:

              【解决方案9】:

              我找到了一个很简单的方法:用nano打开文件:nano file.txt

              Ctrl + O 保存,但在按 Enter 之前,按:Alt+ D 在 DOS 和 Unix/Linux 行尾之间切换,或者:Alt+M 在 Mac 和 Unix/Linux 行尾之间切换,然后按Enter保存,按Ctrl+X退出。

              【讨论】:

              • 在 linux 服务器上完成此操作,文件有 ^M 结尾。另存为dos保留,另存为linux删除。可以使用cat -v进行检查
              • 这个问题是关于 vim,而不是 nano。
              【解决方案10】:

              来自维基:

              %s/\r\+$//g
              

              这将找到直到行尾的所有回车符号(一个和多个代表)并删除,因此只有 \n 将留在 EOL。

              【讨论】:

                【解决方案11】:

                以下命令用于重新格式化当前目录中的所有 .sh 文件。我在我的Fedora 操作系统上对其进行了测试。

                for file in *.sh; do awk '{ sub("\r$", ""); print }' $file >luxubutmp; cp -f luxubutmp $file; rm -f luxubutmp ;done
                

                【讨论】:

                  【解决方案12】:

                  将文件目录从 DOS 转换为 Unix

                  使用命令行和sed,查找当前目录下所有扩展名为“.ext”的文件,并删除所有“^M”

                  @https://gist.github.com/sparkida/7773170

                  find $(pwd) -type f -name "*.ext" | while read file; do sed -e 's/^M//g' -i "$file"; done;
                  

                  另外,如上一个答案中所述,^M = Ctrl+V + Ctrl+M(不要只键入插入符号“^”符号和 M)。

                  【讨论】:

                    【解决方案13】:
                    tr -d '\15\32' < winfile.txt > unixfile.txt
                    

                    (参见:Convert between Unix and Windows text files

                    【讨论】:

                      【解决方案14】:

                      以下步骤可以将 DOS 的文件格式转换为 Unix:

                      :e ++ff=dos     Edit file again, using dos file format ('fileformats' is ignored).[A 1]
                      :setlocal ff=unix     This buffer will use LF-only line endings when written.[A 2]
                      :w     Write buffer using Unix (LF-only) line endings.
                      

                      参考:File format

                      【讨论】:

                      • 链接断了一半。它重定向到另一个页面。
                      【解决方案15】:

                      dos2unix可以直接修改文件内容。

                      可以直接在文件上使用,不需要临时文件重定向。

                      dos2unix input.txt input.txt
                      

                      以上使用假定的美式键盘。使用-437 选项来使用英国键盘。

                      dos2unix -437 input.txt input.txt
                      

                      【讨论】:

                        【解决方案16】:

                        通常有一个dos2unix 命令可以用于此目的。请务必阅读手册,因为 GNU 和 BSD 版本在处理参数的方式上有所不同。

                        BSD 版本:

                        dos2unix $FILENAME $FILENAME_OUT
                        mv $FILENAME_OUT $FILENAME
                        

                        GNU 版本:

                        dos2unix $FILENAME
                        

                        或者,您可以在此处创建自己的dos2unix,并使用任何建议的答案,例如:

                        function dos2unix(){
                            [ "${!}" ] && [ -f "{$1}" ] || return 1;
                        
                            { echo ':set ff=unix';
                              echo ':wq';
                            } | vim "${1}";
                        }
                        

                        【讨论】:

                          【解决方案17】:

                          我通常使用

                          :%s/\r/\r/g
                          

                          这看起来有点奇怪,但由于 Vim 匹配换行符的方式而有效。我也发现它更容易记住:)

                          【讨论】:

                          • 这可以在不同平台上始终如一地工作。最佳答案在这里。
                          • 我之前对:set ff=unix没有任何问题,但是我今天打开的文件一定特别奇怪。 Vim 说它已经是fileformat=unix,但所有的行尾都是^M。这个解决方案对我有用。
                          • 此解决方案为我添加了不需要的额外行,使文件中的行数增加了一倍。 :%s/\r//g 对我有用。
                          • Victor,你的文件可能有 \r\n 结尾。 \r 不被读取为换行符,但 \n 是。在我遇到的文件中是 \r ,你必须添加一个换行符。
                          • @VictorZamanian 的:%s/\r//g唯一 通用解决方案——尤其适用于包含 DOS 和 UNIX 样式换行符的异构混合的混合模式文件。规范的解决方案(例如,:set ff=unix:e ++ff=unix)假设当前缓冲区的每一行都以相同的换行符样式结束。有时他们会这样做;有时他们不会。 提示悲伤的表情。
                          【解决方案18】:

                          :set fileformat=unix 从 DOS 转换为 Unix。

                          【讨论】:

                          • 这实际上为我解决了这个问题。我在搜索时找不到这些字符。
                          【解决方案19】:

                          我更喜欢使用以下命令:

                          :set fileformat=unix
                          

                          您还可以使用macdos 分别将您的文件转换为Mac 或MS-DOS/Windows 文件约定。如果文件已经是正确的格式,它什么也不做。

                          有关更多信息,请参阅 Vim 帮助:

                          :help fileformat
                          

                          【讨论】:

                          • 这个命令在我的 Windows vim 上似乎没有做任何事情。我的视图中仍然有 ^M 字符。
                          • set fileformat=unix 添加到我的 .vimrc 文件有效。
                          【解决方案20】:

                          发件人:File format

                          [Esc] :%s/\r$//

                          【讨论】:

                          • +1 用于指向官方文档站点。对于使用上述链接的任何人,请参阅该页面上的“转换当前文件”部分。
                          • 这个 + vim -b 就像一个魅力,谢谢,+1
                          • 链接断了一半。它重定向到另一个页面。
                          【解决方案21】:

                          使用以下命令:

                          :%s/^M$//g
                          

                          要显示^M,请键入CtrlV,然后键入CtrlMCtrlV 告诉 Vim 直接输入下一个字符。

                          【讨论】:

                            【解决方案22】:
                            :g/Ctrl-v Ctrl-m/s///
                            

                            CtrlM 是字符\r,或回车,DOS 行尾添加。 CtrlV 告诉 Vim 在命令行插入文字 CtrlM 字符。

                            作为一个整体,此命令将所有 \r 替换为空,将它们从行尾删除。

                            【讨论】:

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

                            在 Vim 中,去掉所有回车,只留下换行符。

                            【讨论】:

                            • 由于某些原因,上面的内容在 windows gvim 下对我不起作用。但是当更改为:%s/\r//g 时,它就像一个魅力。
                            • @soltysh :%s/\r\+$//g
                            【解决方案24】:

                            更改视图中的行尾:

                            :e ++ff=dos
                            :e ++ff=mac
                            :e ++ff=unix
                            

                            这也可以用作保存操作(单独的:w 不会使用您在屏幕上看到的行尾进行保存):

                            :w ++ff=dos
                            :w ++ff=mac
                            :w ++ff=unix
                            

                            你可以从命令行使用它:

                            for file in *.cpp
                            do 
                                vi +':w ++ff=unix' +':q' "$file"
                            done
                            

                            【讨论】:

                            • 非常感谢。我为像我这样的懒人尝试了 vi +':wq ++ff=unix'
                            • 这应该是最受好评的答案。 :w +ff=unix 比这里写的大多数其他东西好得多,bash 脚本是一个不错的奖励。
                            • :e 命令在我的 Windows vim 安装中似乎没有任何作用。我的视图仍然显示^M 代码。
                            • 我到处阅读:e ++ff=unix,但对我来说最简单的工作是:w ++ff=unix 然后退出并重新打开文件。
                            • @OlivierPons 但 :e 与重新打开文件的作用相同吗?在您的解决方案中添加更多不必要的步骤如何使其更简单?
                            【解决方案25】:

                            关于让 ^M 出现的评论对我有用。仅在我的 vi 中键入“^M”一无所获(未找到)。 CTRL+V CTRL+M 序列完美地做到了。

                            我的工作替换命令是

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

                            它在我的屏幕上看起来像这样:

                            :%s/^M/\r/g
                            

                            【讨论】:

                              【解决方案26】:

                              您可以使用以下命令:
                              :%s/^V^M//g
                              '^' 表示使用 CTRL 键。

                              【讨论】:

                                【解决方案27】:

                                我想用换行符代替 ^M。 Perl 的救援:

                                perl -pi.bak -e 's/\x0d/\n/g' excel_created.txt
                                

                                或写入标准输出:

                                perl -p -e 's/\x0d/\n/g' < excel_created.txt
                                

                                【讨论】:

                                  猜你喜欢
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  相关资源
                                  最近更新 更多