簡體   English   中英

在vi / vim中保留某些“單詞”時替換

[英]Replace while keeping certain “words” in vi/vim

例如,如果我有$asd['word_123']並且我想用$this->line('word_123')替換它,保留'word_123'。 我怎么能這樣做?

通過使用這個:

%s/asd\[\'.*\'\]/this->line('.*')/g

我無法保持兩者之間的措辭。 請賜教。

使用正則表達式,您可以執行以下操作:%s/\\$asd\\['\\([^']*\\)'\\]/$this->line('\\1')/g

一步步:

%s - 替換整個文件

\\$asd\\[' - match“$ asd ['”。 注意$[需要轉義,因為它們在正則表達式中具有特殊含義。

\\([^']*\\) - \\( \\)可用於選擇所謂的“原子”,以便您可以在替換中使用它。 [^']表示不是 '任何東西, *表示匹配0或更多。

'\\] _ '\\] - 完成我們的比賽。

$this->line('\\1') - 替換為我們想要的東西, \\1替換之前匹配的原子。

g - 對每行的多個匹配執行此操作。

替代(宏)

您也可以使用宏來代替正則表達式。 例如,

qq/\$asd<Enter>ct'$this->line(<Esc>f]r)q

然后根據需要多次使用@q 你可以在使用@q一次后使用@@ ,如果你想使用80次,你可以使用80@q

替代方案(:規范)

在某些情況下,使用:norm可能是最佳選擇。 例如,如果您有一小段代碼,並且您匹配一個唯一的字符或位置。 如果您知道“$”只出現在特定代碼塊的“$ asd”中,您可以直觀地選擇它

:norm $T$ct'this->line(<C-v><Esc>f]r)<Enter>

關於使用:norm更有效的討論,請閱讀:help :normreddit post

嘗試使用

:%s/\$asd\[\'\([^\']\+\)\'\]/$this->line('\1')/g

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM