关于换行符:如何在vim中打开的文件中将^ M换行符转换为“正常”换行符?

How to convert the ^M linebreak to 'normal' linebreak in a file opened in vim?

vim显示在每行结尾^ M

我怎么做用'正常'换行符替换它?


命令

1
2
:%s/<Ctrl-V><Ctrl-M>/
/g

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



说明

1
:%s

替代,%=所有行

1
<Ctrl-V><Ctrl-M>

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

1
2
/
/

用新行(
)

1
g

并在全球范围内进行(不仅仅是第一次出现在线上)。


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

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

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

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


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

:set filetype=unix

:set fileformat=unix

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


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

:e ++ff=dos

发现于:http://vim.wikia.com/wiki/File_format


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

1
2
3
:%s/
/
/g

这很有趣,因为我用相同的字符替换换行符,但我想Vim只需要获得一个新的 r来正确显示。我有兴趣知道为什么这有效的基本机制。


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

我想它可能是unix,那么问题是你的文件是用fileformat=dos创建的,将"^ M ^ J"添加到行尾但是用flieformat=unix读取只从行尾删除"^ J",留下"^ M"。

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


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

1
/^M

应该选择第一个坏线

1
2
:%s/^M/
/g

将用回车替换所有错误的^ M.

这是MacVim中的功能,它基于gvim 7。

编辑:

在我的Windows 10计算机上再次出现此问题,该计算机具有Ubuntu for Windows,我认为这会导致vim的文件格式问题。在这种情况下,将ff更改为unix,mac或dos只会将^ M更改为^ J并再次返回。

在这种情况下的解决方案:

1
2
3
:%s/
$/ /g
:%s/ $//g

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

很抱歉恢复了一个早已被回答的旧问题,但似乎有一些混乱,我想我会帮助清除一些,因为这在谷歌搜索中很高。


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

输入:%s/

CTRL-VCTRL-M

输入//g

Enter

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

这样做::%s(查找和替换)/^M/(该符号)/(没有字符)g(全局)。


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


^ M由Ctrl + VM检索,所以

1
s/^M//g

简单的事情对我有用

1
dos2unix   filename


我用sed做了这个:

sed -i -e 's/
/
/g' filename


怎么样:

:%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中:

    1
    2
    :set ff=unix
    :w


    就我而言,

    没有上面的工作,我有一个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实用程序。 :)


    这对我有用:

    1
    2
    3
    :% s/

    /

    使用以下命令之一:

    1
    2
    :%s/
    //g

    要么

    1
    2
    3
    :%s/
    \(
    \)/\1/g

    只需删除.vimrc中的set binary即可!


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

    1
    2
    sed 's/
    //g'


    在使用vim和eclipse时,这些建议都没有为我设法获得^M换行符的负载。我怀疑我遇到了一个外部案件,但万一我能帮助任何人。

    1
    :%s/.$//g

    它解决了我的问题


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

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

    1
    :g/^M/s// /g

    如果使用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()


    以上都不适合我。 (替换 r,^ M,ctrl-v-ctrl-m)
    我使用复制和粘贴将我的文本粘贴到一个新文件中。

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


    或者,您可以使用此命令修复换行符,而不是使用vim

    1
    fromdos <filename.txt>

    希望能帮助到你!


    在串行控制台上,所有的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的。


    对我来说很好!

    1
    2
    /),/s/),/)
    /g

    变成这样的东西:

    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