我正在尝试用,
新行替换当前文件中的每个:
:%s/,/\n/g
但它插入的内容看起来像是一个^@
而不是实际的换行符.该文件不是DOS模式或任何东西.
我该怎么办?
如果你像我一样好奇,请检查问题为什么\ raim的换行?同样.
\r
而不是\n
.通过\n
在文本中插入空字符来替换.要获得换行符,请使用\r
.但是,在搜索换行符时,您仍然会使用\n
.这种不对称是由于事实\n
和\r
稍微不同的事情:
\n
匹配行尾(换行符),而\r
匹配回车符.另一方面,在替换中\n
插入空字符,同时\r
插入换行符(更准确地说,它被视为输入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.
这是诀窍:
首先,设置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 \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
对于bar
:
\ r =是换行符
\n =空字节.
NUL
= 0x00 = 0 = CTRL@
LF
= 0x0A = 10 = CTRLJ
CR
= 0x0D = 13 =CTRLM
这是ASCII控制字符列表,将它们插入^[
via CTRLvCTRL---key---.
在\r
或其他unix/linux shell中输入CTRL---key---.尽管linux系统使用Line Feeds进行行分隔,但尝试CTRLM使用bash,它与命中相同ENTER,因为shell实现了意义.
要在bash中插入文字,可以使用它们CTRLv.
尝试bash:
echo ^[[33;1mcolored.^[[0mnot colored.
这使用ANSI转义序列,插入两个foo
的via CTRLvESC.
你也可以试试CTRLvCTRLmENTER,这会给你这个:
bash: $'\r': command not found
还记得\n
上面的吗?:>
这个ASCII控制字符列表与完整的ASCII符号表不同,因为CTRL可以在那里找到通过密钥(haha)插入控制台/伪终端/ vim的控制字符.在C和大多数其他语言中,您通常使用八进制代码来表示这些"字符".
如果您真的想知道所有这些来自何处:http://www.linusakesson.net/programming/tty/.
这是关于这个主题你会遇到的最好的链接,但要注意:有龙.
TL; DR
通常bar
= \r
,和s/foo/bar
= \r
.
你需要使用
:%s/,/^M/g
要获得^M
角色,请按,Ctrl v然后按Enter
\r
可以为你做这个工作.
使用Vim在Windows上使用Ctrl+ Q代替Ctrl+V
从eclipse开始,^M
字符可以嵌入到一行中,并且您希望将它们转换为换行符.
:s/\r/\r/g
这是我想的方式的最佳答案,但在表格中会更好:https://stackoverflow.com/a/12389839/962394.
所以,重写:
您需要在正则表达式替换中使用换行符\r
(ascii 0x0A
,unix换行符),但这是替换所特有的 - 您通常应该继续期望用于\n
换行和\r
回车.
这是因为\n
在替换中使用的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 |
注意:^M
(Linux上的Ctrl-V Ctrl-M)在正则表达式替换中使用换行符而不是其他人建议的回车符(我只是尝试过).
另请注意,vim会根据文件格式设置将换行字符保存到文件时进行转换,这可能会使事情变得混乱.
但是,如果必须替换,那么下面的事情是有效的
:%s/\n/\r\|\-\r/g
在上面的每一行中,下一行代替,然后是| - 再次是下一行.这在wiki表中使用.如果文本如下:
line1 line2 line3
改为
line1 |- line2 |- line3
如果您需要为整个文件执行操作,还建议您可以从命令行尝试
sed 's/\\n/\n/g' file > newfile
这是对我有用的答案。来自这个人:
---- quoting 使用vi编辑器在replace中插入换行符
我必须做的其他事情,无法记住,然后必须查找。
在vi中,要在搜索和替换中插入换行符,请执行以下操作:
:%s/look_for/replace_with^M/g
上面的命令会将“ look_for”的所有实例替换为“ replace_with \ n”(其中\ n表示换行符)。
要获取“ ^ M”,请输入组合键Ctrl+ V,然后(释放所有键)Enter按键。