如何在vim中使用正则表达式组查找并替换

23

我正在使用div替换所有内联gist代码片段,以非阻塞方式加载它们。要修改所有具有以下内容的旧文章

<script src='https://gist.github.com/1234.js?file=gistfile1.sh'></script>

我需要用以下内容替换它

<div data-gist=1234><a href='http://gist.github.com/1234'>gistfile1.m</a></div>

到目前为止,我尝试的东西(vim新手)似乎不起作用

:%s/<script src='https:\/\/gist.github.com\/(d+).js?file=gistfile1.sh'><\/script>/<div data-gist={1}><a href='http://gist.github.com/{1}'>gistfile1.m</a></div>//g
1个回答

59

我用以下方法使它工作:

:%s!<script src='https://gist.github.com/\(\d\+\).js?file=gistfile1.sh'></script>!<div data-gist=\1><a href='http://gist.github.com/\1'>gistfile1.m</a></div>!g

需要注意的几点:

  1. 我使用!作为分隔符而不是/,以避免必须转义路径斜线。
  2. 在尝试中,您需要转义(d+)
  3. 您在最后有多余的/
  4. 要插入匹配组,请使用\1而不是{1}

不错!需要注意的是,你需要以 :%s 开始。 - Toran Billups
一个快速的编辑 - 我如何忽略 file=(文件名不同)并且在替换过程中我不需要它,所以它可能会丢失(抱歉,这是范围蔓延)。结果发现每个要点都有不同的文件名,而这些文件名对于此实现实际上并没有太大意义。 - Toran Billups
1
如果您不关心文件名,可以使用 file=[^']\+'。 这将匹配 file= 后面直到下一个 ' 的所有内容。 如果您想在第二部分中使用该名称,则可以在其周围再包装另一个捕获组 () - Tim
你真是太棒了!感谢你快速并且详细地回答了我的问题! - Toran Billups
有人给赏金... :) - mtk
@Tim 为什么在vim中想要创建一个捕获组时需要转义 (),但其他特殊字符如 *[^$ 等却不需要呢?对于从python正则表达式过来的人来说,这很令人困惑,因为在python中,括号直接用于捕获(例如,在python中,要获取一行的第一个和最后一个字符,你需要使用 ^(.).*(.)$,但在vim中,你必须使用 ^\(.\).*\(.\)$)。我猜我的困惑在于通常情况下,当你转义一个字符时,它意味着你想使用它的字面值;但在这种情况下,我们却相反,这感觉不一致,所以我很困惑。 - teepee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接