如何在Vim中用换行符替换字符

如何在Vim中用换行符替换字符,vim,replace,escaping,newline,vi,Vim,Replace,Escaping,Newline,Vi,我试图用新行替换当前文件中的每个,: :%s/,/\n/g 但是它插入了看起来像是一个^@而不是一个实际的换行符。该文件未处于DOS模式或任何状态 我该怎么办 如果你像我一样好奇,也可以检查这个问题。使用\r而不是\n。 替换为\n将在文本中插入空字符。要获取换行符,请使用\r。但是,在搜索换行符时,您仍然会使用\n。这种不对称是由于以下事实造成的:\n和\r: \n匹配行尾(换行符),而\r匹配回车符。另一方面,在替换中,\n插入一个空字符,而\r插入一个换行符(更准确地说,它被视为输入C

我试图用新行替换当前文件中的每个

:%s/,/\n/g 
但是它插入了看起来像是一个
^@
而不是一个实际的换行符。该文件未处于DOS模式或任何状态

我该怎么办

如果你像我一样好奇,也可以检查这个问题。

使用
\r
而不是
\n
。 替换为
\n
将在文本中插入空字符。要获取换行符,请使用
\r
。但是,在搜索换行符时,您仍然会使用
\n
。这种不对称是由于以下事实造成的:
\n
\r

\n
匹配行尾(换行符),而
\r
匹配回车符。另一方面,在替换中,
\n
插入一个空字符,而
\r
插入一个换行符(更准确地说,它被视为输入CR)。这里有一个小的、非交互式的示例来说明这一点,使用Vim命令行特性(换句话说,您可以将以下内容复制并粘贴到终端中以运行它)
xxd
显示结果文件的hextump

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

换句话说,
\n
已将字节0x00插入文本中
\r
已插入字节0x0a。

\r
可以在此处为您完成工作

您需要使用:

:%s/,/^M/g
要获取
^M
字符,请按Ctrl+v,然后按Enter。

在Windows上使用Vim时,使用Ctrl+Q代替Ctrl+v。

以下是技巧:

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

:set magic
接下来,做:

:s/,/,^M/g
要获取
^M
字符,请键入Ctrl+V并按Enter键。在Windows下,按Ctrl+Q,然后输入。我能记住这些的唯一方法是记住它们的意义是多么渺茫:

答:表示换行符最差的控制字符是什么

B:要么是
q
(因为它通常意味着“退出”),要么是
v
,因为很容易错误地键入Ctrl+C并杀死编辑器

A:就这样吧

从中,可以将
^M
字符嵌入到一行中,并希望将其转换为换行符

:s/\r/\r/g

这是对我有用的答案。这家伙说:

----引用


还有一件事我必须做,记不得了,然后不得不去查

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

:%s/look_for/replace_with^M/g
上面的命令将“look\u for”的所有实例替换为“replace\u with\n”(用\n表示换行符)

要获取“^M”,请输入组合键Ctrl+V,然后(释放所有键)按enter键



但如果必须替换,则以下方法有效:

:%s/\n/\r\|\-\r/g
在上面的例子中,每一行都被替换为下一行,然后是
|-
,然后是一个新行。这在wiki表中使用

如果案文如下:

line1
line2
line3
改为

line1
|-
line2
|-
line3

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

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

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


简称: 对于
foo

\r
==“回车”(
CR
/
^M

\n
==匹配Linux/Mac上的“换行符”(
LF
),以及Windows上的
CRLF

对于

\r
==在Linux/Mac上生成
LF
,在Windows上生成
CRLF

\n
==“空字节”(
NUL
/
^@

在linux(即Web服务器上)中编辑最初在windows环境中创建并上载的文件(即FTP/SFTP)时,您在vim中看到的所有
^M
,都是
CR
,linux不会翻译这些文件,因为它只使用
LF
来描述换行符


更长(使用ASCII数字):
NUL
==0x00==0==Ctrl+@=
^@
显示在vim中
LF
==0x0A==10==Ctrl+J
CR
==0x0D==13==Ctrl+M==
^M
显示在vim中

这是一份清单。通过Ctrl+V、Ctrl+---键将它们插入Vim

在Bash或其他Unix/Linux shell中,只需键入Ctrl+--key---

在Bash中尝试Ctrl+M。这与按Enter键是一样的,因为shell意识到这意味着什么,即使Linux系统使用换行符进行划界

要在bash中插入文字,也可以使用Ctrl+V组合键在文字前加上前缀

在Bash中尝试:

echo ^[[33;1mcolored.^[[0mnot colored.
这使用了。通过Ctrl+V、Esc插入两个
^[

您还可以尝试Ctrl+V、Ctrl+M、Enter,这将为您提供以下信息:

bash: $'\r': command not found
还记得上面的
\r
吗?:>

此列表不同于完整列表,因为可以在其中找到通过Ctrl键(哈哈)插入控制台/伪终端/Vim的控制字符

而在C和大多数其他语言中,通常使用八进制代码来表示这些“字符”

如果你真的想知道这些都是从哪里来的:。这是关于这个话题你会遇到的最好的链接,但是要小心:有龙


博士


通常
foo
=
\n
bar
=
\r

这是我认为最好的答案,但在表格中会更好:

因此,重写:

您需要使用
\r
在正则表达式替换中使用换行符(ASCII
0x0A
,Unix换行符),但这是替换所特有的-您通常应该继续使用
\n
换行符和
\r
换行符

这是因为Vim在替换中使用了
\n
表示零字符(ASCII
0x00bash: $'\r': command not found
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>