vim 里面为什么用:s 来替换$$$$为$$,却会替换成$$$?

2022-05-17 10:12:10 +08:00
 movq

一行是这样的:

$$$$

光标移到在这一行行首,输入:s/&&&&/&&/g然后按回车,发现剩下来$$$而不是$$,这是为什么呢

2062 次点击
所在节点    程序员
13 条回复
dier
2022-05-17 10:25:39 +08:00
我猜可能是因为`$`在 shell 环境是变量的开头,把"$"开头的内容识别成变量了吧。有些符号在 shell 环境中有特殊含义,所以不转义就会有问题。
我试着在每个"$"前加个"\"转义符就正常了。
另外,我还试了# % &
#和%不转义都能正常替换,&却是越替换越多🤣
nightwitch
2022-05-17 10:35:50 +08:00
在正则表达式里`$`这个符号有特殊含义。
要当普通字符来处理前面需要加\转义
movq
2022-05-17 10:37:17 +08:00
不好意思标题和内容有误,我是把 &&&& 替换成 &&,标题和内容的$都应该改成&
movq
2022-05-17 10:39:38 +08:00
@dier 对于&&&&, 我用:s/\&\&\&\&/\&\&/g 是越替换越多, :s/\&\&\&\&/&&/g 是没发生任何变化
movq
2022-05-17 10:41:44 +08:00
$$$$用:s/$$$$/$$/g 替换是成了$$$

用:s/\$\$\$\$/$$/g 替换是成了$$
dier
2022-05-17 11:06:29 +08:00
@movq #4 刚才试了一下"&"这个符号的替换,在 vim 中暂时没找到合适的替换方法,不知道是不是我的理解还不够。
不过我试过在外面用 sed 命令尝试替换,发现是可行的`sed -i 's/\&\&\&\&/\&\&/' filename`
Kobayashi
2022-05-17 11:31:36 +08:00
:set nomagic

:help magic
AoEiuV020CN
2022-05-17 11:37:23 +08:00
%s/&&&&/\&\&/g
%s/\$\$\$\$/$$/g
013231
2022-05-17 11:44:37 +08:00
`&`符号在替换字符串中有特殊意义,代表"the whole matched pattern"。
那么对于字符串"&&&&",用命令`:s/&&&&/&&/g`替换,"the whole matched pattern"是"&&&&",替换为两个"the whole matched pattern",就变成了 8 个&。
正确的正确的写法是`:s/&&&&/\&\&/g`。
DrakeXiang
2022-05-17 12:10:30 +08:00
vim 的正则有点不一样,我经常要用\v 来实现,但是有时候又不行
nothingistrue
2022-05-17 13:50:15 +08:00
nothingistrue
2022-05-17 14:03:20 +08:00
替换有两个参数,第一个是用于查找的正则表达式,第二个是替换内容。替换内容也不是普通文本,也有特殊字符,但又跟正则表达式的特殊字符不是一套规则。然后不同语言的实现规则还不一定一样,比如说用的用$0-9 ,有的用&0-9
psyngw
2022-05-17 15:21:21 +08:00
:s /\V&&&&/\&\&/g
模式匹配有好几个开关,这种关键字可以多用用 `\V`

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/853363

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX