Regular-Expression

用於多次替換的 ed 中的子表達式

  • July 31, 2021

假設我有一段文字說:

John went with Sally to the market where they bought fresh bread. There they met with Jim and dined together.

假設我想編寫一個正則表達式,用加號將 John、Sally 和 Jim 的名字括起來,例如,

+John+ went with +Sally+ to the market where they bought fresh bread. There they met with +Jim+ and dined together.

我創建了以下正則表達式,成功將第一個名稱更改為 +John+:

g/\(.*\)\(\<John\>\)\(.*\)/s//\1+\2+\3/gp

我想創建一個同時替換所有三個名稱的名稱,而無需重新執行該命令。

我嘗試了一個簡單的多重替換,例如:

g/John/s//+&+/\
s/Sally/+&+/\
s/Jim/+&+/p

但這僅更改了每個名稱的第一個實例。

您的編輯命令幾乎是正確的。

g/./ s/John/+&+/g\
s/Sally/+&+/g\
s/Jim/+&+/gp

這裡有兩個主要變化:

  1. 與命令一起使用的正則表達式g必須與我們可能想要應用命令列表的所有行匹配。您使用John了 ,這意味著除非在同一行上有 a ,否則Sally不會更改為。+Sally+``John

我在.這裡使用選擇所有非空行,但您也可以使用 eg^$選擇所有行。使用它可能更有意義,...以便我們選擇足夠長的行以包含 string Jim,這是三個名稱中最短的一個。 2. 我將g標誌與三個命令中的每一個s///一起使用,以對每行上的每個非重疊匹配進行替換。我正在使用gp最後一個替換,但這只是因為您自己這樣做了,以查看命令的效果。

如果您需要將其與類似字元串區分開來,則使用\<John\>代替,如果您的系統 C 庫的基本正則表達式 (BRE) 支持它(這也適用於在 BRE 中使用(更改)之類的東西,這是非標準的,但這將允許您在 GNU 系統上編寫)。John``Johnny``\|``g/./ s/John\|Sally\|Jim/+&+/gp

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