我试图用新行替换当前文件中的每一行:
:%s/,/\n/g
但它插入了一个类似于^@的内容,而不是实际的换行符。该文件未处于DOS模式或任何状态。
我该怎么办?
如果您像我一样好奇,请检查问题:为什么\r是Vim的新线?也
我试图用新行替换当前文件中的每一行:
:%s/,/\n/g
但它插入了一个类似于^@的内容,而不是实际的换行符。该文件未处于DOS模式或任何状态。
我该怎么办?
如果您像我一样好奇,请检查问题:为什么\r是Vim的新线?也
使用\r而不是\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并杀死编辑器。A: 做到这一点。
这是对我有用的答案
----引用使用vi编辑器在替换中插入换行符
还有一些事情我必须做,但我记不住了,然后不得不抬头看。
在vi中,要在搜索和替换中插入换行符,请执行以下操作:
:%s/look_for/replace_with^M/g
上面的命令会将“look_for”的所有实例替换为“replace_with\n”(\n表示换行)。
要获得“^M”,请输入组合键Ctrl+V,然后(释放所有键)按enter键。
但如果必须替换,则以下方法有效:
:%s/\n/\r\|\-\r/g
在上文中,每一行都被替换为下一行,然后是|-,然后是一行。这在wiki表中使用。
如果文本如下:
line1
line2
line3
更改为
line1
|-
line2
|-
line3
在语法s/foo/bar中,\r\n和\n有不同的含义,具体取决于上下文。
短:
对于foo:
\r==“回车”(CR/^M)\n==在Linux/Mac上匹配“换行符”(LF),在Windows上匹配CRLF
对于棒材:
\r==在Linux/Mac上生成LF,在Windows上生成CRLF\n==“空字节”(NUL/^@)
当在linux中编辑最初在windows环境中创建并上传(即FTP/SFTP)的文件时(即在Web服务器上),您在vim中看到的所有^M都是CR,而linux不会翻译,因为它只使用LF来描述换行符。
更长(带ASCII数字):
NUL==0x00==0==Ctrl+@==^@显示在vim中LF==0x0A==10==Ctrl+JCR==0x0D==13==Ctrl+M==^M显示在vim中
以下是ASCII控制字符列表。通过Ctrl+V、Ctrl+---键---将它们插入Vim。
在Bash或其他Unix/Linux shell中,只需键入Ctrl+---键---。
在Bash中尝试Ctrl+M。这与按Enter键相同,因为shell意识到这是什么意思,尽管Linux系统使用换行符进行换行。
要在bash中插入文字,也可以在它们前面加上Ctrl+V。
试试巴什:
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。
这是我认为最好的答案,但放在桌子上会更好:
为什么\r是Vim的换行符?
因此,重新编写:
您需要使用\r在正则表达式替换中使用换行符(ASCII 0x0A,Unix换行符),但这是替换所特有的-您通常应该继续使用\r换行符和\r回车符。
这是因为Vim在替换中用于表示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根据其文件格式设置保存到文件时,它将转换换行符,这可能会混淆问题。