例如,我有一個文本, 10 3 4 2 10,如圖4所示,10 ....如何在VI/VIM編輯器中用每種情況下不同的發現詞替換?
沒有我想用不同的話
我知道%S/10 /替換來改變各10 -words/gc但它只讓我替換爲yes/no的交互方式,但我想用replace1,3,4,2,replace2,4,replace3等不同的詞來更改每個出現的10個字符....
例如,我有一個文本, 10 3 4 2 10,如圖4所示,10 ....如何在VI/VIM編輯器中用每種情況下不同的發現詞替換?
沒有我想用不同的話
我知道%S/10 /替換來改變各10 -words/gc但它只讓我替換爲yes/no的交互方式,但我想用replace1,3,4,2,replace2,4,replace3等不同的詞來更改每個出現的10個字符....
替換每個出現10
與replace{index_of_match}
:
:let @a=1 | %s/10/\='replace'.(@a+setreg('a',@a+1))/g
替換的10
每次出現與字從預定義的數組:
:let b = ['foo', 'bar', 'vim'] | %s/10/\=(remove(b, 0))/g
替換爲從預定義的陣列的字的10
每次出現時,與匹配的索引:
:let @a=1 | let b = ['foo', 'bar', 'vim'] | %s/10/\=(b[@a-1]).(@a+setreg('a',@a+1))/g
但是由於無論如何你都必須輸入任何單詞,第二個和第三個功能的好處是很小的。從SpoonMeiser看到「手動」解決方案的答案。
更新:作爲希望,在第二示例中的正則表達式的一部分的解釋:在文檔中
%
=在每行上
s/<search>/<replace>/g
= s
裝置執行搜索&替換,g
手段替換每一次出現。
\=
將以下內容解釋爲代碼。
remove(b, 0)
刪除列表b
的索引0處的元素並將其返回。
因此第一次出現。行會%s/10/foo/g
第二次,列表現在只有['bar', 'vim']
所以行會%s/10/bar/g
等
注:這是一個快速草稿,不可能達到它的最佳&乾淨的方法,如果有人想要改進它,請隨時添加評論
是否存在您想要的單詞的模式,或者您希望在每次出現要替換的單詞時輸入每個單詞的模式?
如果我用不同的詞替換「10」的每個實例,我可能會做一定程度手動:
/10
cw
<type word>ESC
ncw
<type word>ESC
ncw
<type word>ESC
似乎沒有哪個過於繁重,如果每個字是不同的,有無論如何都要單獨打字。
在示例中顯示,替換詞有增量編號,那麼您需要什麼或替換可能是隨機的? – Sundeep