Vi

根據前 n 個字元替換單詞

  • November 23, 2016

我有一個包含如下數據的文件:

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。我發現它對於解決某些正則表達式非常有價值。

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