Vi
根據前 n 個字元替換單詞
我有一個包含如下數據的文件:
ab001 ab002 ab003 ab004
我必須將所有以“ab”開頭的單詞替換為“ab001”,即在更改文件後應該像
ab001 ab001 ab001 ab001
%s/ab*/ab001/g
我在編輯器中嘗試過VI
,但沒有給出預期的結果。我也嘗試Google但找不到任何解決方案。
既然你用vi標記了這個並且最初詢問了 vi,我將解釋為什麼它在 vi 中對你不起作用,以及如何修復它。你說你最初嘗試過:
%s/ab*/ab001/g
搜尋的
*
工作方式是盡可能多地匹配前一個原子 0 次或更多次。來自:h /*
:*/star* */\star* * (use \* when 'magic' is not set) Matches 0 or more of the preceding atom, as many as possible.
在這種情況下,前一個原子是’b’,所以這個搜尋將匹配以下任何一個:
a ab abbb abbbbbbbbbbbbbbbbbbb
它也會匹配
ab001
,但它只匹配它的第一部分,所以匹配是(ab)001
。Vi 發現您正在搜尋此內容,並將其替換為(ab001)001
. 解決方案很簡單。你想匹配‘ab’ 後跟任何東西
點字元 (
.
) 將匹配除換行符以外的任何字元。所以如果你搜尋/ab.*/
它將匹配以“ab”開頭的*任何內容。*所以你要:
:%s/ab.*/ab001/g
如果這匹配太多(例如,像“絕對”這樣的詞),您可以將其簡化為僅查找數字。例如,這將匹配 ‘ab’ 後跟任意數量的數字:
/ab\d*/
這將匹配 ‘ab’ 後跟三個數字:
/ab\d\{3}/
我建議將此頁面添加為書籤,以便快速參考 vi-regex。我發現它對於解決某些正則表達式非常有價值。