我试图用新行替换当前文件中的每一行:
:%s/,/\n/g
但它插入了一个类似于^@的内容,而不是实际的换行符。该文件未处于DOS模式或任何状态。
我该怎么办?
如果您像我一样好奇,请检查问题:为什么\r是Vim的新线?也
我试图用新行替换当前文件中的每一行:
:%s/,/\n/g
但它插入了一个类似于^@的内容,而不是实际的换行符。该文件未处于DOS模式或任何状态。
我该怎么办?
如果您像我一样好奇,请检查问题:为什么\r是Vim的新线?也
当前回答
如果您需要对整个文件执行此操作,我还建议您可以从命令行尝试:
sed 's/\\n/\n/g' file > newfile
其他回答
这是对我有用的答案
----引用使用vi编辑器在替换中插入换行符
还有一些事情我必须做,但我记不住了,然后不得不抬头看。
在vi中,要在搜索和替换中插入换行符,请执行以下操作:
:%s/look_for/replace_with^M/g
上面的命令会将“look_for”的所有实例替换为“replace_with\n”(\n表示换行)。
要获得“^M”,请输入组合键Ctrl+V,然后(释放所有键)按enter键。
您需要使用:
:%s/,/^M/g
要获取^M字符,请按Ctrl+v,然后按Enter键。
但如果必须替换,则以下方法有效:
:%s/\n/\r\|\-\r/g
在上文中,每一行都被替换为下一行,然后是|-,然后是一行。这在wiki表中使用。
如果文本如下:
line1
line2
line3
更改为
line1
|-
line2
|-
line3
这是我认为最好的答案,但放在桌子上会更好:
为什么\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根据其文件格式设置保存到文件时,它将转换换行符,这可能会混淆问题。
对于Windows上的Vim,使用Ctrl+Q代替Ctrl+V。