代码之家  ›  专栏  ›  技术社区  ›  Scott Skiles

在vim中的第一个“>”和下一个“<”之间查找并替换

  •  0
  • Scott Skiles  · 技术社区  · 6 年前

    我有一个html表,其中有一些标题:

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

    我想在第一次 > 下一个 < 具有 {{ }} :

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

    我知道我可以用 :s/\%Vth/td/g 替换所有 th 具有 td ,但是我如何使用Vim的regex来查找和替换 > < 具有 {{ }} ?

    我试过以下的方法,但没有成功

    :s/\%V\>(.*?)\</{{   }}/g
    
    4 回复  |  直到 6 年前
        1
  •  1
  •   Kent    6 年前

    如果您愿意冒着在vim中通过regex更改html/vim的风险,您可以执行以下操作:

    %s/>[^<]*</>{{ & }}</g
    
        2
  •  1
  •   Wiktor Stribiżew    6 年前

    你可以用

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

    在一个非魔法模式下, \< \> 是文字界限,这就是为什么他们没有在你这边工作。另外, *? ,一个类似Perl的惰性量词,应该写成 \{-} 在维姆。这个 % 开头的符号告诉Vim搜索并替换所有行,而不仅仅是当前行。

    细节

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

    替代品是 >{{ \1 }}< , >{{ ,组1值和 }}> . g 对行执行多个搜索和替换操作。

        3
  •  0
  •   rgt47    6 年前

    我可能误读了这个问题,但似乎所需的替换文本是在3个空格周围成对的双大括号(而不是在原始匹配文本周围: “将第一个和下一个之间的所有内容替换为{{}” . 如果正确,那么下面的简单替换命令应该可以工作:

    %s/>.*</>{{   }}</g
    
        4
  •  0
  •   SergioAraujo    6 年前

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

    :%norm cit{{ }}
    

    如您所知,“cit”是一个vim文本对象,代表“changeinternaltag”。 如果每行有多个标记,可以尝试:

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

    更多阅读 :h text-objects :h \zs