Vi

在 vi 編輯器中的替換中使用插入符號 (^)

  • March 31, 2021

我正在使用 CentOS,並且正在編輯器中閱讀替換命令s///, 。vi我想測試我看到的一些例子:

:%s/old/new/g     Substitutes old with new throughout the file
:.,$s/old/new/g   Substitutes old with new from the current cursor position to the end of the file

上面的範例對我來說按預期工作,但包含插入符號 ( ^) 的以下範例不起作用:

:^,.s/old/new/g   Substitutes old with new from the beginning of the file to the current cursor position

我試過了,但它沒有用,所以插入符號不起作用還是我輸入的命令不正確?

vi編輯器中,以及在兩者中exed(在 BSD 系統上可以找到),^地址是前一行。這意味著該命令^d將刪除前一行,^m.將這一行與前一行交換,並將替換與前一行和這一行^,.s/old/new/g匹配的所有字元串。old``new

編輯器是對原始和編輯器的vim擴展重新實現,通常安裝在 Linux 系統上,名稱為 、和,沒有這種定址上一行的方式,並且將響應“ E492:不是編輯命令”如果您嘗試使用它。您可以使用或代替它:vi``ex``vim``vi``ex``-``-1

-,.s/old/new/g

使用--1代替^也適用於ed非GNU 系統exvi

POSIX 標準與編輯器有關的內容如下:ed

從歷史上看,ed接受^字元作為地址,在這種情況下,它與<hyphen-minus>字元相同。POSIX.1-2017 不要求或禁止這種行為。

和編輯器有類似的措辭(是 “行編輯器模式”):vi``ex``ex``vi

從歷史上看,exvi接受^字元作為地址和命令的標誌偏移量。在這兩種情況下,它都與-角色相同。POSIX.1-2017 不要求或禁止這種行為。

請注意,您似乎引用的文本表示^,.從文件頂部到目前行的所有行。這是不正確的。它僅針對前一行和目前行,並且僅在vi(andexed) 的“歷史準確”實現中這樣做。要定址從編輯緩衝區開始到目前行的所有行,請使用1,..

-instead ^-of-1錯字可能來自於這樣的想法:“因為$是正則表達式中的行尾錨點,也是編輯緩衝區中最後一行的地址^,, 是行首錨點因此,正則表達式必須(通過對稱性)是編輯緩衝區的第一行”。

只是提供另一個瑣事:該^地址也不能在ed編輯器的 GNU 實現中使用。與 的任何其他實現一樣ed--1仍可用作替代方案。

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