我想替换每个,
在由新线当前文件:
:%s/,/\n/g
但它会插入看起来像^@
而不是实际的换行符。 该文件不在DOS模式下或其他任何状态。
我该怎么办?
如果您像我一样好奇,请查看问题, 为什么\\ ra newline for Vim? 也一样
#1楼
这是窍门:
首先,设置Vi(m)会话以允许使用特殊字符(即:换行符)进行模式匹配。 可能值得将此行放入.vimrc或.exrc文件中:
:set magic
接下来,执行:
:s/,/,^M/g
要获取^M
字符,请输入Ctrl + V,然后按Enter 。 在Windows下, 按Ctrl + Q ,然后输入 。 我唯一能记住这些的方法是记住它们的意义:
答: 用来代表换行符的最糟糕的控制字符是什么?
B:
q
(因为通常表示“退出”)或v
是因为错误输入Ctrl + C并杀死编辑器非常容易。答: 可以。
#2楼
在语法s/foo/bar
,根据上下文, \\r
和\\n
具有不同的含义。
短:
对于foo
:
\\ n =换行符(在Linux / Mac上为LF,在Windows上为CR + LF)
\\ r =回车(CR)
对于bar
:
\\ r =是换行符
\\ n =空字节。
更长(使用ASCII数字):
NUL
= 0x00 = 0 = Ctrl + @ LF
= 0x0A = 10 = Ctrl + J CR
= 0x0D = 13 = Ctrl + M
这是ASCII控制字符的列表。 通过Ctrl + V , Ctrl + --- key ---将它们插入Vim。
在Bash或其他Unix / Linux shell中,只需键入Ctrl + --- key --- 。
在Bash中尝试Ctrl + M 。 尽管Linux系统使用换行符进行行定界,但Shell意识到了它的含义与按Enter相同。
要在bash中插入文字,也可以在它们前面加上Ctrl + V 。
在Bash中尝试:
echo ^[[33;1mcolored.^[[0mnot colored.
这使用ANSI转义序列 。 通过Ctrl + V , Esc插入两个^[
's。
您也可以尝试按Ctrl + V , Ctrl + M , Enter ,这将为您提供:
bash: $'\r': command not found
还记得上面的\\r
吗? :>
该ASCII控制字符列表与完整的ASCII符号表不同 ,在于可以在其中找到通过Ctrl键(haha)插入到控制台/伪终端/ Vim中的控制字符。
而在C语言和大多数其他语言中,通常使用八进制代码表示这些“字符”。
如果您真的想知道所有这些信息来自何处: TTY变得神秘 。 这是您会遇到的关于此主题的最佳链接,但请注意:有龙。
TL; DR
通常foo
= \\n
和bar
= \\r
。
#3楼
这是我思考方式的最佳答案,但在表中会更好:
因此,改写:
您需要使用\\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在基于文件格式设置保存到文件时会转换换行符,这可能会引起混乱。
#4楼
使用\\r
代替\\n
。
用\\n
替换会在文本中插入一个空字符。 要获取换行符,请使用\\r
。 搜索换行符时,您仍将使用\\n
。 这种不对称性是由于\\n
和\\r
所做的事情略有不同 :
\\n
匹配行尾(换行符),而\\r
匹配回车符。 另一方面,在替换中, \\n
插入一个空字符,而\\r
插入一个换行符(更准确地说,它被视为输入<CR> )。 这是一个小的非交互式示例,使用Vim命令行功能进行了说明(换句话说,您可以将以下内容复制并粘贴到终端中以运行它)。 xxd
显示了结果文件的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。
#5楼
\\r
可以为您完成这里的工作。
#6楼
您需要使用:
:%s/,/^M/g
要获取^M
字符,请按Ctrl + v,然后按Enter 。
#7楼
在Windows上的Vim中,使用Ctrl + Q代替Ctrl + V。
#8楼
在Eclipse中 , ^M
字符可以嵌入到一行中,并且您希望将它们转换为换行符。
:s/\r/\r/g
#9楼
这是对我有用的答案。 来自这个人:
---- quoting 使用vi编辑器在replace中插入换行符
我必须做的其他事情,无法记住,然后必须查找。
在vi中,要在搜索和替换中插入换行符,请执行以下操作:
:%s/look_for/replace_with^M/g
上面的命令会将“ look_for”的所有实例替换为“ replace_with \\ n”(其中\\ n表示换行符)。
要获取“ ^ M”,请输入组合键Ctrl + V ,然后(释放所有键)按Enter键。
#10楼
但是如果必须替换,则可以进行以下操作:
:%s/\n/\r\|\-\r/g
在上面,下一行替换为下一行,然后|-
再次替换为新行。 这在Wiki表中使用。
如果文本如下:
line1
line2
line3
改为
line1
|-
line2
|-
line3
#11楼
如果您需要对整个文件执行此操作,还建议我可以从命令行尝试:
sed 's/\\n/\n/g' file > newfile