V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
movq
V2EX  ›  程序员

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

  •  
  •   movq · 2022-05-17 10:12:10 +08:00 · 2222 次点击
    这是一个创建于 931 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一行是这样的:

    $$$$

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

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

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

    :help magic
    AoEiuV020CN
        8
    AoEiuV020CN  
       2022-05-17 11:37:23 +08:00   ❤️ 2
    %s/&&&&/\&\&/g
    %s/\$\$\$\$/$$/g
    013231
        9
    013231  
       2022-05-17 11:44:37 +08:00   ❤️ 1
    `&`符号在替换字符串中有特殊意义,代表"the whole matched pattern"。
    那么对于字符串"&&&&",用命令`:s/&&&&/&&/g`替换,"the whole matched pattern"是"&&&&",替换为两个"the whole matched pattern",就变成了 8 个&。
    正确的正确的写法是`:s/&&&&/\&\&/g`。
    DrakeXiang
        10
    DrakeXiang  
       2022-05-17 12:10:30 +08:00
    vim 的正则有点不一样,我经常要用\v 来实现,但是有时候又不行
    nothingistrue
        12
    nothingistrue  
       2022-05-17 14:03:20 +08:00   ❤️ 1
    替换有两个参数,第一个是用于查找的正则表达式,第二个是替换内容。替换内容也不是普通文本,也有特殊字符,但又跟正则表达式的特殊字符不是一套规则。然后不同语言的实现规则还不一定一样,比如说用的用$0-9 ,有的用&0-9
    psyngw
        13
    psyngw  
       2022-05-17 15:21:21 +08:00   ❤️ 1
    :s /\V&&&&/\&\&/g
    模式匹配有好几个开关,这种关键字可以多用用 `\V`
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1012 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 21:46 · PVG 05:46 · LAX 13:46 · JFK 16:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.