如何在Vim中用换行符替换字符

本文详细介绍了如何在Vim编辑器中正确使用换行符进行替换操作,包括设置允许特殊字符匹配,使用Ctrl+V或Ctrl+Q组合键插入换行符,以及在不同上下文中的换行符表示方法。还提到了其他编辑器和环境中的类似操作。
摘要由CSDN通过智能技术生成

我想替换每个,在由新线当前文件:

:%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 + VCtrl + --- 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 + VEsc插入两个^[ 's。

您也可以尝试按Ctrl + VCtrl + MEnter ,这将为您提供:

bash: $'\r': command not found

还记得上面的\\r吗? :>

ASCII控制字符列表与完整的ASCII符号表不同 ,在于可以在其中找到通过Ctrl键(haha)插入到控制台/伪终端/ Vim中的控制字符。

而在C语言和大多数其他语言中,通常使用八进制代码表示这些“字符”。

如果您真的想知道所有这些信息来自何处: TTY变得神秘 。 这是您会遇到的关于此主题的最佳链接,但请注意:有龙。


TL; DR

通常foo = \\nbar = \\r


#3楼

这是我思考方式的最佳答案,但在表中会更好:

为什么\\ ra newline for Vim?

因此,改写:

您需要使用\\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
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值