如何在 Vim 中用换行符替换字符
题
我正在尝试替换每个 ,
在当前文件中换行:
:%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”键。