在vim中查找并替换第一个'>'和下一个'<'

时间:2018-08-03 13:38:58

标签: regex vim

我有一个带有一些标题的html表:

<th>Header01</th>
...
<th>Different Header 20</th>

我想查找第一个>和下一个<之间的所有内容并将其替换为{{ }}

<td>{{   }}</td>
...
<td>{{   }}</td>

我知道我可以使用:s/\%Vth/td/gth替换所有td,但是如何使用Vim的正则表达式来查找和替换>和{{ 1}}和<

我尝试以下操作均未成功

{{    }}

4 个答案:

答案 0 :(得分:1)

您可以使用

%s/>\(.\{-}\)</>{{ \1 }}</g

在非非常魔术模式下,\<\>是单词边界,这就是为什么它们对您不利的原因。此外,类似Perl的惰性量词*?在Vim中应写为\{-}。开头的%符号告诉Vim在所有行上进行搜索和替换,而不仅仅是当前行。

详细信息

  • >-匹配>
  • \(.\{-}\)-将任何0个或更多字符捕获到组1中(但换行符,如果需要包括换行符,请在.之前加上\_),但应尽可能少
  • <-匹配<

替换为>{{ \1 }}<>{{,组1值和}}>g对行进行多次搜索和替换操作。

答案 1 :(得分:1)

如果您冒着用正则表达式更改html / vim的风险,可以在vim中这样做:

%s/>[^<]*</>{{ & }}</g

答案 2 :(得分:0)

我可能误解了问题,但似乎所需的替换文本是在3个空格周围成对的双括号(不是在原始匹配文本的周围:“将第一个>和下一个<之间的所有内容替换为{{} }“ 。如果正确,则下面的简单替代命令应该起作用:

%s/>.*</>{{   }}</g

答案 3 :(得分:0)

如果每行只有一个标签->内容,则可以执行以下操作:

:%norm cit{{ }}

如您所知,“ cit”是vim文本对象,代表“更改内部标签”。 如果每行上都有很多标签,则可以尝试:

:%s,>\zs[^<]*\ze</.*,{{ }},g

有关更多信息,请阅读:h text-objects:h \zs