Vim

VIM 替換一行中特定單詞後出現的模式

  • September 20, 2013

我的文字中有這樣的台詞。

模式之前的文本 = 垃圾** 模式之後的文本是模式

如果在 VIM 中我這樣做%s/pattern/saturn/,它會替換所有出現的pattern. 但我只想替換之後出現的那些=。它應該忽略之前出現的行中的所有內容=。怎麼做?

您可以使用特殊原子在之前\@<=斷言匹配(使其在該行之前的任何位置):=.*

:%s/\(=.*\)\@<=pattern/saturn/g

假設您只有一次patternbefore =,您可以分兩步執行此操作:

:%s/pattern/saturn/g
:%s/saturn\(.\{-}=\)/pattern\1/

\{-}指示惰性匹配(.也稱為非貪婪)。

解釋

第一步用下一步替換所有出現的pattern,然後查找之前saturn的單詞並將其替換為。saturn``=``pattern

警告

這假設=每行出現一次。

更好的方法(僅假設=每行一個)

您可以使用遞歸宏來做到這一點:

qaqqa:%s/\(=.\{-}\)pattern/\1saturn/@aq@a

這用替換了一次出現的patternafter 。當儲存為宏並遞歸呼叫時,它將繼續處理文件,直到沒有任何東西可以替代。這是hackish,但它的工作原理。=``saturn

也可以看看

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