Vim

Vim 重用命中搜尋和替換 html 標籤

  • December 18, 2019

我想替換 vim 中的 html 標籤,但重用我找到的內容。即我想更換

<div class="subSectionTitle">
  Title 1 
</div>

<h1>
  Title 1 
<h1>

我嘗試使用,s/pattern/replacement/但不知何故,字元串沒有插入。執行後

:%s/<div class="subSectionTitle">\_.\{-}<\/div>/<h1>\1<\/h1>/g

只得到

<h1></h1>

有人可以解釋萬用字元在 vim 中的工作原理以及為什麼\1不是我想要的文本嗎?

  • 唯一匹配普通字元,.但不匹配換行符。由於您的 HTML 標記跨越多行,因此沒有匹配項。請改用\_.原子 ( :help /\_.)。
  • 您在替換內部引用內部文本\1,但實際上並沒有擷取它。為此,請附上\(...\)
  • 貪婪匹配 via將*匹配第一個開始標籤和最後一個結束標籤,其他標籤將在擷取組中被吞噬,所以這只適用於一次出現。要更改所有匹配項,請使用非貪婪匹配替換*\{-}。(或使用第二種選擇。)
:%s/<div class="subSectionTitle">\(\_.\{-}\)<\/div>/<h1>\1<\/h1>/g

或者,您可以分別匹配開始和結束標籤。(無論如何,即使是原始的單個匹配也不會處理在嵌套標籤的情況下替換相應的結束標籤。)我沒有擷取開始和結束標籤的不同開頭,而是通過特殊/\zs原子開始實際匹配。

:%s/<\zsdiv class="subSectionTitle">\|<\/zsdiv>/h1>/g

引用自:https://unix.stackexchange.com/questions/557879