我正在尝试用,
新行替换当前文件中的每个文件:
:%s/,/\n/g
但它会插入看起来像a的^@
字符串,而不是实际的换行符。该文件不在DOS模式下或其他任何状态。
我该怎么办?
如果您像我一样好奇,请查看问题,为什么\ ra newline for Vim?也一样
我正在尝试用,
新行替换当前文件中的每个文件:
:%s/,/\n/g
但它会插入看起来像a的^@
字符串,而不是实际的换行符。该文件不在DOS模式下或其他任何状态。
我该怎么办?
如果您像我一样好奇,请查看问题,为什么\ ra newline for Vim?也一样
Answers:
\r
代替\n
。替换方式\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。
\r
不能像这样工作。但是您可以按Ctrl-V
Enter
代替打字\r
,它可以工作。
\r
插入<CR>
并\n
插入null,我该如何用回车替换?
这是窍门:
首先,设置Vi(m)会话以允许使用特殊字符(即:换行符)进行模式匹配。可能值得将此行放入.vimrc或.exrc文件中:
:set magic
接下来,执行:
:s/,/,^M/g
要获取^M
角色,请输入Ctrl+ V并点击Enter。在Windows下,做Ctrl+ Q,Enter。我唯一能记住这些的方法是记住它们的意义:
答:用来代表换行符的最糟糕的控制字符是什么?
B:要么
q
(因为它通常表示“退出”),要么v
是因为很容易错误输入Ctrl+ C并杀死编辑器。答:可以。
:set magic
(也不在我的〜/ _vimrc中)ctrl-q
。只需ctrl-v
输入一个简单的后缀即可^M
为我创建角色。
Ctrl-C
虽然可以取消您返回“普通”模式,但实际上并不会杀死编辑器。Ctrl-V
表示逐字记录,Ctrl-Q
表示有人错误地加载了$VIMRUNTIME/mswin.vim
配置文件。您不需要mswin。只需使用您自己的vimrc即可。
sed -n l
一直做到现在。很高兴知道Ctrl-v
在vim中可以实现相同的效果。
在语法s/foo/bar
,\r
并\n
有不同的含义,具体取决于上下文。
对于foo
:
\ n =换行符(在Linux / Mac上为LF,在Windows上为CR + LF)
\ r =回车(CR)
对于bar
:
\ r =是换行符
\ n =空字节。
NUL
= 0x00 = 0 = Ctrl+ @
LF
= 0x0A = 10 = Ctrl+ J
CR
= 0x0D = 13 = Ctrl+M
这是ASCII控制字符的列表。通过Ctrl+ V,Ctrl+将它们插入Vim ---key---。
在Bash或其他Unix / Linux shell中,只需输入Ctrl+ ---key---。
在Bash中尝试Ctrl+ M。Enter尽管Linux系统使用换行符来进行行定界,但它与hiting一样,因为Shell可以实现含义。
要在bash中插入文字,在它们前面加上Ctrl+ V也可以。
在Bash中尝试:
echo ^[[33;1mcolored.^[[0mnot colored.
这使用ANSI转义序列。将两个^[
“通过S Ctrl+ V,Esc。
您也可以尝试Ctrl+ V,Ctrl+ M,Enter,它会给你这样的:
bash: $'\r': command not found
还记得\r
上面的吗?:>
该ASCII控制字符列表与完整的ASCII符号表不同,在于Ctrl可以在其中找到通过键(haha)插入到控制台/伪终端/ Vim中的控制字符。
而在C语言和大多数其他语言中,通常使用八进制代码表示这些“字符”。
如果您真的想知道所有这些信息来自何处:TTY变得神秘。这是您会遇到的关于此主题的最佳链接,但请注意:有龙。
TL; DR
通常foo
= \n
和bar
= \r
。
:s/x/^M/g
应该可以。插入^M
通孔,ctrl-v
然后插入ctrl-m
。
这是我思考方式的最佳答案,但在表中会更好:
因此,改写:
您需要在正则表达式替换中使用换行符\r
(ASCII 0x0A
,Unix换行符),但这是该替换所特有的-通常,您应该继续期望用于\n
换行和\r
回车。
这是因为Vim \n
在替换中表示NIL字符(ASCII 0x00
)。您可能曾希望NIL可以\0
代替它,以释放\n
其通常用于换行的功能,但\0
在正则表达式替换中已经具有含义,因此将其更改为\n
。因此,然后进一步将换行符也从转换\n
为\r
(在正则表达式模式中为回车符ASCII 0x0D
)。
性格 ASCII码| C表示| 正则表达式匹配| 正则表达式替换 ------------------------- + ------------ + ----------- ------- + ------------- + ------------------------ 无| 0x00 | \ 0 | \ 0 | \ n 换行符(Unix换行符)| 0x0a | \ n | \ n | \ r 回车| 0x0d | \ r | \ r | <未知>
注:^M
(Ctrl+ V Ctrl+ M在Linux上)中插入一个正则表达式替换,而不是一个回车时,正如其他人劝换行符(我只是尝试了)。
还要注意,Vim在基于文件格式设置保存到文件时会转换换行符,这可能会引起混乱。
但是如果必须替换,则可以进行以下操作:
:%s/\n/\r\|\-\r/g
在上面,下一行替换为下一行,然后|-
再替换一行。这在Wiki表中使用。
如果文本如下:
line1
line2
line3
改为
line1
|-
line2
|-
line3
如果您需要对整个文件执行此操作,还建议我可以从命令行尝试:
sed 's/\\n/\n/g' file > newfile
printf 'foo\\nbar\n' | sed 's/\\n/\n/g'
查看它是否可以在您的系统上运行。(此建议在freenode上#bash的好人贷。)
这是对我有用的答案。来自这个人:
---- quoting 使用vi编辑器在replace中插入换行符
我必须做的其他事情,无法记住,然后必须查找。
在vi中,要在搜索和替换中插入换行符,请执行以下操作:
:%s/look_for/replace_with^M/g
上面的命令会将“ look_for”的所有实例替换为“ replace_with \ n”(其中\ n表示换行符)。
要获取“ ^ M”,请输入组合键Ctrl+ V,然后(释放所有键)Enter按键。