Regular-Expression
用於多次替換的 ed 中的子表達式
假設我有一段文字說:
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
這裡有兩個主要變化:
- 與命令一起使用的正則表達式
g
必須與我們可能想要應用命令列表的所有行匹配。您使用John
了 ,這意味著除非在同一行上有 a ,否則Sally
不會更改為。+Sally+``John
我在
.
這裡使用選擇所有非空行,但您也可以使用 eg^
或$
選擇所有行。使用它可能更有意義,...
以便我們選擇足夠長的行以包含 stringJim
,這是三個名稱中最短的一個。 2. 我將g
標誌與三個命令中的每一個s///
一起使用,以對每行上的每個非重疊匹配進行替換。我正在使用gp
最後一個替換,但這只是因為您自己這樣做了,以查看命令的效果。如果您需要將其與類似字元串區分開來,則使用
\<John\>
代替,如果您的系統 C 庫的基本正則表達式 (BRE) 支持它(這也適用於在 BRE 中使用(更改)之類的東西,這是非標準的,但這將允許您在 GNU 系統上編寫)。John``Johnny``\|``g/./ s/John\|Sally\|Jim/+&+/gp