2012-10-11 22 views
1

可能重複:
Replace while keeping certain 「words」 in vi/vim在前面和線的VIM年底將單詞

比方說,我有幾條線象

  $adv_id; 
      $am_name; 
      $campaign_ids; 
      $repeat_on; 
      $opt_days; 
      $opt_time; 
      $am_or_pm; 

比方說,我使用視覺模式來選擇所有的線..我怎麼能在每一行的開始和結尾添加字符,所以它看起來很重要摹狀

 $_REQUEST($adv_id); 
     $_REQUEST($am_name; 
     $_REQUEST($campaign_ids); 
     $_REQUEST($repeat_on; 
     $_REQUEST($opt_days); 
     $_REQUEST($opt_time); 
     $_REQUEST($am_or_pm); 
+1

請參閱[這個答案](http://stackoverflow.com/a/1174350/637284) – halex

+1

您可能會發現我的答案[這裏](http://stackoverflow.com/questions/11624166/replace-whilekeeping -v-vi-vim/11624201#11624201)很有幫助。 – Conner

回答

4

非常相似的other question,這樣的解釋應該幫助你瞭解這個替代品。在選擇作爲視覺塊的線條,用這個替代命令:

:'<,'>s/\$\(.*\);/$_REQUEST(\1); 

和以前一樣,'<,'>會自動填寫你在命令行有一個視覺的選擇,如果你。

這裏的區別是,我們正在使用\(\)做出捕獲組,這將捕獲正則表達式的一部分,並且在更換再次使用它,使用\1,它指的是第一捕獲組。

而且,由於此正則表達式使用$字面上來定位更換,它需要被轉義:\$,因爲它在正則表達式特殊的意義:線的結束。

如果你需要有一個單一的線多個替代品,你需要添加g標誌,你可能需要刪除分號:

:'<,'>s/\$\(.*\);/$_REQUEST(\1)/g 

相反的正則表達式,例如與$adv_id;更換$_REQUEST($adv_id);,是很相似的:

:'<,'>s/\$_REQUEST(\(.*\))/\1 

在這裏,我們捕獲組捕獲一個$_REQUEST(...);的括號之間的一切,並且捕獲組是整個更換。

+0

爲什麼我們在前面使用$,因爲它表示行結束? – CodeCrack

+0

@CodeCrack我們並沒有使用它來表示line_這裏的_end,因此需要轉義它。我們希望從字面上使用它,因爲您想要更改的所有匹配都以「$」字符開頭,所以我們可以將該字符作爲匹配的開始。 – pb2q

+0

好的!沒有抓住那個。謝謝 – CodeCrack

1

在視覺模式下,打:和在命令行使用:

:'<,'>s/^\(.*\);$/$_REQUEST(\1);/g 

\(\)捕獲該行的匹配的表達式和\1回顧所捕獲的組中的取代基。

使用:'<,'>會告訴Vim通過以下命令(在本例中爲s)過濾當前選擇。