我有一个带有一些标题的html表:
<th>Header01</th>
...
<th>Different Header 20</th>
我想查找第一个>
和下一个<
之间的所有内容并将其替换为{{ }}
:
<td>{{ }}</td>
...
<td>{{ }}</td>
我知道我可以使用:s/\%Vth/td/g
用th
替换所有td
,但是如何使用Vim的正则表达式来查找和替换>
和{{ 1}}和<
?
我尝试以下操作均未成功
{{ }}
答案 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