我正在尝试替换每个 , 在当前文件中换行:

:%s/,/\n/g 

但它插入了看起来像 ^@ 而不是实际的换行符。该文件不处于 DOS 模式或任何模式。

我应该怎么办?

如果你像我一样好奇,请检查问题 为什么 是 Vim 的换行符? 以及。

有帮助吗?

解决方案

使用 \r 代替 \n.

替换为 \n 在文本中插入一个空字符。要获取换行符,请使用 \r. 。什么时候 寻找 对于换行符,你仍然会使用 \n, , 然而。这种不对称性是由于以下事实 \n\r 做稍微不同的事情:

\n 匹配行尾(换行符),而 \r 匹配回车符。另一方面,在换人方面 \n 插入一个空字符,而 \r 插入换行符(更准确地说,它被视为输入 <CR>)。这是一个小型的非交互式示例,使用 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。

其他提示

这是技巧:

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

:set magic

接下来,执行以下操作:

:s/,/,^M/g

为了得到 ^M 字符、类型 控制-v 并击中 进入. 。在 Windows 下,执行 控制-q, 进入. 。我能记住这些的唯一方法就是记住它们是多么没有意义:

A: 用于表示换行符的最糟糕的控制字符是什么?

乙: 任何一个 q (因为它通常意味着“退出”)或 v 因为它很容易输入 控制-C 错误地杀死了编辑。

A: 就这样吧。

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


短的:

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

为了 bar:
= 是换行符
= 空字节。

更长:(带有ascii数字)

NUL = 0x00 = 0 = 控制键@
LF = 0x0A = 10 = 控制键J
CR = 0x0D = 13 = 控制键中号

这是一个列表 ASCII 控制字符, ,将它们插入 vim 通过 控制键v控制键 - -钥匙 - -.
bash 或者其他 UNIX/Linux shell 只需输入 控制键 - -钥匙 - -. 。尝试 控制键中号 在 bash 中,它与 hit 相同 进入, ,因为 shell 意识到其含义,即使 Linux 系统使用换行符进行行分隔。

要在 bash 中插入文字,请在它们前面加上 控制键v 也会起作用。

在 bash 中尝试:

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

这使用 ANSI 转义序列, ,插入两个 ^[的途径 控制键vESC键.

你也可以尝试 控制键v控制键进入, ,这会给你这个:

bash: $'\r': command not found

记住 \r 从上面?:>

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

如果你真的想知道这一切从何而来: http://www.linusakesson.net/programming/tty/.
这是您会遇到的有关此主题的最佳链接,但请注意:那里有龙。


长话短说

通常 foo = \n, , 和 bar = \r.

你需要使用

:%s/,/^M/g

为了得到 ^M 字符,按 控制键 v 其次是 进入

\r 可以在这里为您做工作。

在 Windows 上使用 Vim 控制键+ 代替 控制键+V

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

所以,改写一下:

你需要使用 \r 使用换行符(ascii 0x0a, ,unix 换行符)在正则表达式替换中,但这是替换所特有的 - 您通常应该继续期望使用 \n 用于换行和 \r 用于回车。

这是因为vim使用了 \n 在替换中表示 NIL 字符(ascii 0x00)。你可能期望 NIL 是 \0 相反,释放 \n 通常用于换行,但是 \0 在正则表达式替换中已经具有含义,因此它被转移到 \n. 。因此,然后进一步将换行符从 \n\r (在正则表达式模式中是回车符,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>

注意: ^M (Linux 上的 Ctrl-V Ctrl-M)在正则表达式替换中使用时插入换行符,而不是像其他人建议的那样插入回车符(我刚刚尝试过)。

另请注意,vim 在保存到文件时会根据文件格式设置转换换行符,这可能会造成混乱。

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

:s/\r/\r/g

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

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

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

line1
line2
line3

更改为

line1
|-
line2
|-
line3

如果您需要对整个文件执行操作,还建议我您可以从命令行尝试

sed 's/\\n/\n/g' file > newfile

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

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


还有一些事情我必须做但不记得了,然后必须查找。

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

:%s/look_for/replace_with^m/g上面的命令将用“ replace_with n”替换所有“ look_for”的实例(with n含义newline)

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


许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top