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

How to replace a character by a newline in Vim

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

1
2
:%s/,/
/g

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

我该怎么办?

如果您和我一样好奇,请检查问题:为什么为vim添加新行?也。



代替


替换将在文本中插入一个空字符。要获得新线,请使用
。然而,在搜索新行时,您仍然可以使用
。这种不对称是由于

做的事情略有不同:


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

1
2
3
4
5
6
7
echo bar > test
(echo 'Before:'; xxd test) > output.txt
vim test '+s/b/
/'
'+s/a/
/'
+wq
(echo 'After:'; xxd test) >> output.txt
more output.txt
1
2
3
4
Before:
0000000: 6261 720a                                bar.
After:
0000000: 000a 720a                                ..r.

换句话说,
已将字节0x00插入文本;
已插入字节0x0a。


诀窍如下:

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

1
:set magic

下一步,做:

1
:s/,/,^M/g

要获取^M字符,请键入control v,然后单击enter。在Windows下,执行control qenter。我唯一能记住这些的方法就是记住它们的意义有多小:

A: What would be the worst control-character to use to represent a newline?

B: Either q (because it usually means"Quit") or v because it would be so easy to type Control-c by mistake and kill the editor.

A: Make it so.


在语法和s/foo/bar

有不同的意义,取决于上下文。

短:

foo
换行(LF)在Linux / Mac的Windows下的CRLF)
R =回车(CR)

bar
R =是换行
n = 0字节。

气味:(与ASCII码号码)

NUL==0=0x00 ctrl @
LF==10=0x0a ctrlj
CR= = = ctrlm 0x0d 13

这里是列表中的ASCII控制字符,插入他们在vim密钥通过ctrlvctrl————
bash或其他UNIX / Linux的shell只是ctrl型————密钥。尝试ctrlm在bash中,其enter相同的AS,AS realizes壳是什么意思,即使使用Linux系统的delimiting饲料行线。

要插入文字的prepending bash,所以他们有ctrlv想工作。

在bash:try

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

本使用ANSI转义序列,通过插入两ctrlvesc ^[吗。

所以你可能想尝试ctrlvctrlmenter,这给你。

1
2
bash: $'
'
: command not found

从以上
记得吗?:>

这是一个ASCII控制字符列表从一个完整的ASCII符号表不同,它是控制字符,这是插入A控制台/假顶生)以ctrl密钥(哈哈),我们可以找到。而在C和其他语言,你都必须使用八进制码到论文的代表人物。

如果你真的想知道这是来自:http:/ / / / / www.linusakesson.net编程tty(终端)。
这是最好的链接,你会在关于这个主题,但注意:有龙。

铊;博士

通常foo
bar
=,=。


你需要使用

1
:%s/,/^M/g

要获取^M字符,请按ctrl v,然后按enter



可以在这里为您工作。


在Windows上使用VIM时,使用CtrL+Q代替CtrL+VbkBD


这是最好的方式,我认为答案是,但它会是更好的在一个表:http:/ / / / 12389839 stackoverflow.com 962394。

因此,rewording:

你需要使用
to use a换行(ASCII 0x0a,UNIX换行)正则表达式替换,但这是一个独特的替代都认为你应该继续使用

for for换行和回车。

这是因为在一个
VIM使用替换的字符(ASCII 0x00尼罗河均值)。你可能已经有一个好的\0尼罗河,释放其正常使用的
换行,但已经有一\0正则表达式的意义在什么replacements所以它移到
。因此,要继续到"换行和
因此移到
(这是a正则表达式模式中0x0d回车字符,ASCII)。

1
2
3
4
5
6
7
8
9
10
character                | ascii code | C representation | regex match | regex replacement
-------------------------+------------+------------------+-------------+------------------------
nil                      | 0x00       | \0               | \0          |

line feed (unix newline) | 0x0a       |
               |
          |
carriage return          | 0x0d       |
               |
          | <unknown>

注:^M(按Ctrl - V M a当插入换行符在Linux)中使用的正则表达式替换,而比别人有我As a回车(我想它)。

所以要注意翻译的Vim换行字符特殊文件时,它是基于其文件格式可以设置和工业问题。


在Eclipse中,^M字符可以嵌入到一行中,并且您希望将它们转换为换行符。

1
2
3
:s/
/
/g

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

1
2
3
4
:%s/
/
\|\-
/g

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

1
2
3
line1
line2
line3

改为

1
2
3
4
5
line1
|-
line2
|-
line3

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

1
2
3
sed 's/\
/
/g'
file > newfile


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

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

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

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

:%s/查找/替换为^m/g上面的命令将"look"的所有实例替换为"replace"with (with 表示换行)

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