vim 里面为什么用:s 来替换$$$$为$$,却会替换成$$$? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
movq
V2EX    程序员

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

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

    一行是这样的:

    $$$$

    光标移到在这一行行首,输入: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
    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     Solana     3164 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 00:40 PVG 08:40 LAX 16:40 JFK 19:40
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86