我正在尝试用,
新行替换当前文件中的每个:
:%s/,/\n/g
但它会插入看起来像 a^@
而不是实际的换行符。该文件未处于 DOS 模式或任何状态。
我该怎么办?
如果您像我一样好奇,请检查问题Why is \ra newline for 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
角色,请键入Ctrl+V并点击Enter。在 Windows 下,执行Ctrl+ Q, Enter. 我能记住这些的唯一方法是记住它们的意义有多大:
A:用来表示换行符的最差控制字符是什么?
B:要么
q
(因为它通常意味着“退出”)要么v
因为很容易错误地输入Ctrl+C并杀死编辑器。答:就这样吧。
在语法s/foo/bar
中,\r
有\n
不同的含义,视上下文而定。
对于foo
:
\r
== "回车" ( CR
/ ^M
) ==在 Linux/Mac 和Windows上
\n
匹配 "换行" ( )LF
CRLF
对于bar
:
\r
==LF
在 Linux/Mac 上产生,CRLF
在 Windows 上
\n
== "null byte" ( NUL
/ ^@
)
在 linux 中编辑最初在 windows 环境中创建并上传(即 FTP/SFTP)的文件(即在网络服务器上)时 -^M
您在 vim 中看到的所有 ' 都是CR
linux 不翻译的文件,因为它仅使用LF
's 来描绘换行符。
NUL
== 0x00 == 0 == Ctrl+ @==^@
在 vim 中显示
LF
== 0x0A == 10 == Ctrl+ J
CR
== 0x0D == 13 == Ctrl+ M==^M
在 vim 中显示
这是ASCII 控制字符的列表。Ctrl通过+ V, Ctrl+将它们插入 Vim ---key---。
在 Bash 或其他 Unix/Linux shell 中,只需键入Ctrl+ ---key---。
在 Bash 中尝试Ctrl+ 。M这与 hit 相同Enter,因为 shell 意识到了它的含义,即使 Linux 系统使用换行符来分隔行。
要在 bash 中插入文字,在它们前面加上Ctrl+V也可以。
在 Bash 中尝试:
echo ^[[33;1mcolored.^[[0mnot colored.
这使用ANSI 转义序列。^[
通过Ctrl+ V,插入两个Esc。
您也可以尝试Ctrl+ V, Ctrl+ M, Enter,这将为您提供:
bash: $'\r': command not found
还记得\r
上面的吗?:>
这个ASCII 控制字符列表与完整的ASCII 符号表Ctrl不同,因为可以在其中找到通过键(哈哈)插入控制台/伪终端/Vim 的控制字符。
而在 C 和大多数其他语言中,您通常使用八进制代码来表示这些“字符”。
如果您真的想知道这一切的来源:TTY 已揭开神秘面纱。这是您将遇到的有关此主题的最佳链接,但请注意:有龙。
TL;博士
通常foo
=\n
和bar
= \r
。
你需要使用:
:%s/,/^M/g
要获取^M
字符,请按Ctrl+ ,v然后按Enter。
\r
可以为您完成这里的工作。
在 Windows 上使用 Vim,使用Ctrl+Q代替Ctrl+ V。
这是我认为的最佳答案,但在表格中会更好:
所以,改写:
您需要在正则表达式替换中\r
使用换行符(ASCII 0x0A
,Unix 换行符),但这是替换所特有的 - 您通常应该继续期望使用\n
换行符和\r
回车符。
这是因为 Vim\n
在替换中使用了 NIL 字符 (ASCII 0x00
)。您可能已经预料到 NIL 会被\0
释放\n
,因为它通常用于换行,但\0
在正则表达式替换中已经有了意义,所以它被转移到\n
. 因此,然后进一步将换行符从\n
to \r
(在正则表达式模式中是回车符 ASCII 0x0D
)。
性格 | ASCII码 | C 表示 | 正则表达式匹配 | 正则表达式替换 -------------------------+------------+------------ --------+--------------+------------ 无 | 0x00 | \0 | \0 | \n 换行(Unix 换行) | 0x0a | \n | \n | \r 回车 | 0x0d | \r | \r | <未知>
注意:^M
( Linux上的Ctrl++ V Ctrl)M在正则表达式替换中使用时插入换行符,而不是其他人建议的回车符(我刚刚尝试过)。
另请注意,Vim 将根据其文件格式设置保存到文件时转换换行符,这可能会造成混淆。
在Eclipse中,^M
字符可以嵌入一行,您希望将它们转换为换行符。
:s/\r/\r/g
但是,如果必须替换,则以下内容有效:
:%s/\n/\r\|\-\r/g
在上面,每下一行都被下一行替换,然后|-
又是一个新行。这用于 wiki 表格。
如果文字如下:
line1
line2
line3
它改为
line1
|-
line2
|-
line3
这是对我有用的答案。来自这个人:
----quoting使用 vi 编辑器在替换中插入换行符
其他一些我必须做的事情,我不记得了,然后不得不抬头看。
在 vi 中,要在搜索和替换中插入换行符,请执行以下操作:
:%s/look_for/replace_with^M/g
上面的命令会将所有“look_for”实例替换为“replace_with\n”(\n 表示换行符)。
要获得“^M”,请输入组合键Ctrl+ V,然后(释放所有键)按Enter键。
如果您需要对整个文件执行此操作,我还建议您可以从命令行尝试:
sed 's/\\n/\n/g' file > newfile