我想这样做:
%s/shop_(*)/shop_\1 wp_\1/
为什么shop_(*)
不匹配任何内容?
发布于 2010-07-27 05:24:21
如果我没理解错的话,你想让%s/shop_\(.*\)/shop_\1 wp_\1/
转义捕获括号并使用.*
匹配任意数量的任意字符。
(您的搜索将搜索"shop_“,后跟任意数量的左括号和右括号)
发布于 2021-01-01 08:45:59
如果您希望避免使用捕获括号进行转义,并使正则表达式模式语法更接近于其他实现(例如,PCRE),则添加\v
(非常神奇!)在您的模式开始时(有关更多信息,请参阅:help \magic
):
:%s/\vshop_(*)/shop_\1 wp_\1/
发布于 2020-09-11 01:40:15
@Luc如果你看这里:regex-info,你会看到vim的行为是正确的。这里有一个与sed类似的例子:
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
我讨厌看到vim中伤--尤其是当它的行为正确的时候。
另外,我试着将它添加为注释,但就是不能正确地格式化。
https://stackoverflow.com/questions/3339080
复制相似问题