代码之家  ›  专栏  ›  技术社区  ›  nnyby

Vim regex反向引用

  •  50
  • nnyby  · 技术社区  · 15 年前

    我想这样做:

    %s/shop_(*)/shop_\1 wp_\1/
    

    为什么不呢 shop_(*)

    2 回复  |  直到 15 年前
        1
  •  27
  •   Stephen    15 年前

    %s/shop_\(.*\)/shop_\1 wp_\1/

    转义括号并使用 .*

    (您的搜索是搜索“shop\”,后跟任意数量的左括号和右括号)

        2
  •  77
  •   Daenyth    10 年前

    这里有几个问题。

    1. vim regexen中的paren不是用来捕获的——您需要使用 \( \) 捕捉。

    2. * shop_ ( 然后是文字 )
      你在找什么 . .* 意思是“任何字符的0或更多”。您可能至少需要一个字符,所以请使用 .\+ ( +

    使用此选项: %s/shop_\(.\+\)/shop_\1 wp_\1/ .

    g 在最后一个斜杠之后替换一行上的所有实例,而不仅仅是第一行。

        3
  •  0
  •   Graham Nicholls    4 年前

    @如果你看这里: regex-info

    echo "123abc456" | sed 's#^([0-9]*)([abc]*)([456]*)#\3\2\1#'
    sed: -e expression #1, char 35: invalid reference \3 on 's' command's RHS
    

    而对于“转义”括号,它是有效的:

    echo "123abc456" | sed 's#^\([0-9]*\)\([abc]*\)\([456]*\)#\3\2\1#'
    456abc123
    

    PS我试图添加这个作为一个评论,但就是不能得到正确的格式。

        4
  •  0
  •   Josh Bode    4 年前

    如果您想避免转义捕获括号并使regex模式语法更接近其他实现(例如PCRE),请添加 \v (非常神奇!)在模式开始时(请参见 :help \magic

    :%s/\vshop_(*)/shop_\1 wp_\1/