我正在尝试用新行替换当前文件中的每个,
:
:%s/,/\n/g
但它插入看起来像^@
而不是实际的换行符。该文件不是DOS模式或任何东西。
我该怎么办?
如果你像我一样好奇,请检查问题Why is \r a newline for Vim?。
\r
而不是\n
。用\n
代替在文本中插入一个空字符。要获得换行符,请使用\r
。但是,在搜索换行符时,您仍然会使用\n
。这种不对称是由于\n
和\r
do slightly different things的事实:
\n
匹配行尾(换行符),而\r
匹配回车符。另一方面,在替换中,\n
插入一个空字符,而\r
插入一个换行符(更准确地说,它被视为输入<CR>)。这是一个小的非交互式示例,使用Vim命令行功能来说明这一点(换句话说,您可以将以下内容复制并粘贴到终端中以运行它)。 xxd
显示结果文件的hexdump。
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。
如果您需要为整个文件执行操作,还建议您可以从命令行尝试
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”的所有实例(\ n表示换行符)
得到“^ M”,输入组合键“ctrl-V”,然后按下“输入”键(释放所有键)。
这是诀窍:
首先,设置vi(m)会话以允许模式匹配特殊字符(即:换行符)。将此行放在.vimrc或.exrc文件中可能是值得的。
:set magic
接下来,做:
:s/,/,^M/g
要获取^M
字符,请键入Control-v并按Enter键。在Windows下,执行Control-q,Enter。我记住这些的唯一方法就是记住它们的意义不大:
答:用于表示换行符的最差控制字符是什么?
B:
q
(因为它通常意味着“退出”)或v
,因为错误地键入Control-c并杀死编辑器会很容易。答:这样做。
在语法s/foo/bar
\r
和\n
有不同的含义,取决于上下文。
对于foo
:
\ n =换行符(linux / mac上的LF,Windows上的CRLF)
\ r =回车(CR)
对于bar
:
\ r =是换行符
\ n =空字节。
NUL
= 0x00 = 0 = CTRL @
LF
= 0x0A = 10 = CTRLJ
CR
= 0x0D = 13 = CTRLM
这是ASCII control characters的列表,通过CTRLvCTRL --- key ---将它们插入vim
。
在bash
或其他unix / linux shell中只需输入CTRL --- key ---。尝试在bash中使用CTRLM,它与命中ENTER一样,因为shell意识到了这意味着什么,即使linux系统使用Line Feeds进行行分隔。
要在bash中插入文字,使用CTRLv前置它们也可以。
尝试bash:
echo ^[[33;1mcolored.^[[0mnot colored.
这使用ANSI escape sequences,通过CTRLvESC插入两个^[
。
您也可以尝试CTRLvCTRLmENTER,它将为您提供:
bash: $'\r': command not found
还记得上面的\r
吗? :>
这个ASCII control characters列表与完整的ASCII symbol table不同,因为可以在那里找到通过CTRL键(haha)插入控制台/伪终端/ vim的控制字符。在C和大多数其他语言中,您通常使用八进制代码来表示这些“字符”。
如果你真的想知道这些来自哪里:http://www.linusakesson.net/programming/tty/。 这是关于这个主题你会遇到的最好的链接,但要注意:有龙。
TL; DR
通常foo
= \n
,bar
= \r
。
你需要使用
:%s/,/^M/g
要获取^M
字符,请按Ctrl v,然后按Enter键
\r
可以为您完成这项工作。
使用Windows上的Vim,使用Ctrl + Q代替Ctrl + 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会根据文件格式设置将换行字符保存到文件时进行转换,这可能会使事情变得混乱。
从eclipse开始,^M
字符可以嵌入到一行中,并且您希望将它们转换为换行符。
:s/\r/\r/g
但是,如果必须替代,那么下面的事情是有效的
:%s/\n/\r\|\-\r/g
在上面的每一行中,下一行代替,然后是| - 再次是下一行。这在wiki表中使用。如果文本如下:
line1
line2
line3
改为
line1
|-
line2
|-
line3