代码之家  ›  专栏  ›  技术社区  ›  Vinko Vrsalovic

如何在vim中用换行符替换字符?

  •  1713
  • Vinko Vrsalovic  · 技术社区  · 16 年前

    我想换一个 , 在当前文件中以新行显示:

    :%s/,/\n/g 
    

    但是它插入了看起来像 ^@ 而不是真正的换行。文件不在DOS模式或其他模式下。

    我该怎么办?

    如果你很好奇,像我一样,检查一下问题。 Why is \r a newline for Vim? 也。

    11 回复  |  直到 6 年前
        1
  •  2220
  •   Konrad Rudolph    9 年前

    使用 \r 而不是 \n .

    替代 \n 在文本中插入空字符。要获取换行符,请使用 R . 什么时候? 搜索 对于新品,你仍然会使用 \n 然而。这种不对称是由于 \n R do slightly different things :

    \n 匹配行尾(换行),而 R 匹配回车。另一方面,在替换中 \n 插入一个空字符,而 R 插入换行符(更准确地说,它被视为输入 <CR & GT; )这里有一个小的、非交互的例子来说明这一点,使用VIM命令行功能(换句话说,您可以复制并粘贴下面的内容到一个终端来运行它)。 xxd 显示结果文件的十六进制转储。

    echo bar > test
    (echo 'Before:'; xxd test) > output.txt
    vim test '+s/b/\n/' '+s/a/\r/' +wq
    (echo 'After:'; xxd test) >> output.txt
    more output.txt
    
    Before:
    0000000: 6261 720a                                bar.
    After:
    0000000: 000a 720a                                ..r.
    

    换言之, \n 已将字节0x00插入文本中; R 已插入字节0x0a。

        2
  •  179
  •   Logan    8 年前

    诀窍如下:

    首先,将vi(m)会话设置为允许模式匹配特殊字符(即:换行符)。将这一行放入.vimrc或.exrc文件中可能是值得的。

    :set magic
    

    下一步,做:

    :s/,/,^M/g
    

    得到 ^M 字符类型 控制 - V 击中 进入 . 在窗户下面,行吗? 控制 - Q , 进入 . 我唯一能记住这些的方法就是记住它们的意义有多小:

    答: 用来表示换行符的最坏控制字符是什么?

    B: 要么 q (因为它通常意味着“退出”)或 v 因为打字很容易 控制 - C 误杀了编辑。

    答: 这样做吧。

        3
  •  80
  •   sjas Pushkar Phule    6 年前

    在句法中 s/foo/bar \r \n 根据上下文,有不同的含义。


    短路:

    为了 foo :
    \ N=换行(Linux/Mac上的LF,Windows上的CRLF)
    \ R=回车(CR)

    为了 bar :
    r=换行符
    \n=null字节。

    长:(带ASCII码)

    NUL =0x00=0= CTRL @
    LF =0x0a=10= CTRL J
    CR =0x0d=13= CTRL

    这是一份 ASCII control characters ,将它们插入 vim 通过 CTRL V CTRL ---钥匙--- .
    bash 或者其他unix/linux shell只需键入 CTRL ---钥匙--- . 尝试 CTRL 在bash中,它与击 进入 正如shell意识到的那样,即使Linux系统使用换行符进行行定界。

    在bash中插入literal,在其前面加上 CTRL V 也会起作用。

    尝试BASH:

    echo ^[[33;1mcolored.^[[0mnot colored.
    

    这种用途 ANSI escape sequences ,插入两个 ^[ 通过 CTRL V ESC .

    你也可以试试 CTRL V CTRL 进入 ,这将为您提供:

    bash: $'\r': command not found
    

    记住 R 从上面?&:

    这个 ASCII控制字符 列表与完整列表不同 ASCII symbol table ,其中控制字符通过 CTRL 钥匙(哈哈),可以在那里找到。 而在C语言和大多数其他语言中,通常使用八进制代码来表示这些“字符”。

    如果你真的想知道这一切从何而来: http://www.linusakesson.net/programming/tty/ .
    这是你在这个话题上遇到的最好的链接,但是要注意:有龙。


    DR

    通常 = \n 酒吧 = R .

        4
  •  48
  •   sjas Pushkar Phule    9 年前

    你需要使用

    :%s/,/^M/g
    

    得到 ^M 字符,按 Ctrl键 V 然后 进入

        5
  •  31
  •   Arslan Ali    9 年前

    \r 能在这里为你工作吗?

        6
  •  21
  •   Shef    13 年前

    在Windows上使用VIM Ctrl键 + Q 代替 Ctrl键 + V

        7
  •  9
  •   Dave Bennett    9 年前

    从日食开始, ^M 字符可以嵌入到行中,并且您希望将它们转换为换行符。

    :s/\r/\r/g
    
        8
  •  8
  •   Community pid    7 年前

    这是我认为最好的答案,但在桌子上会更好: https://stackoverflow.com/a/12389839/962394 .

    所以,改写:

    你需要使用 \r 使用换行符(ASCII 0x0a ,unix换行符)在regex替换中,但这是替换所特有的-您通常应该继续使用 \n 用于线路馈送和 R 用于回车。

    这是因为Vim使用 \n 在替换中表示nil字符(ascii 0x00 )你可能以为没有 \0 相反,释放 \n 通常用于生产线进料,但是 0 已经在regex替换中有了意义,所以它被转移到 \n . 因此,进一步将换行符从 \n R (在regex模式中是回车符,ascii 0x0d )

    character                | ascii code | C representation | regex match | regex replacement
    -------------------------+------------+------------------+-------------+------------------------
    nil                      | 0x00       | \0               | \0          | \n
    line feed (unix newline) | 0x0a       | \n               | \n          | \r
    carriage return          | 0x0d       | \r               | \r          | <unknown>
    

    NB: ^M (Linux上的ctrl-v ctrl-m)在regex替换中使用时插入新行,而不是像其他人建议的那样插入回车(我刚刚尝试过)。

    另外请注意,Vim将根据其文件格式设置将换行符保存到文件中,这可能会混淆问题。

        9
  •  6
  •   Kiran K Telukunta    13 年前

    但是如果必须替换,那么下面的事情就可以了

    :%s/\n/\r\|\-\r/g
    

    在上面,每一行都被下一行替换,然后-再替换下一行。这在wiki表中使用。 如果文本如下:

    line1
    line2
    line3
    

    改为

    line1
    |-
    line2
    |-
    line3
    
        10
  •  5
  •   Evan Donovan    13 年前

    如果你需要做一个完整的文件,它也建议我,你可以尝试从命令行

    sed 's/\\n/\n/g' file > newfile
    
        11
  •  3
  •   user407749    13 年前

    这是对我有用的答案。从这个家伙

    引用 http://jaysonlorenzen.wordpress.com/2009/04/28/use-vi-editor-to-insert-newline-char-in-replace/


    我还得做一些我记不起来的事,然后再去看看。

    在vi中,要在搜索和替换中插入换行符,请执行以下操作:

    :%s/查找/替换为^m/g 上面的命令将用replace_替换look for的所有实例,替换为\n(表示换行)

    要获得^M,请输入组合键ctl-v,然后(释放所有键)按Enter键。