如何用sed搜尋和替換,但在第一個匹配組之後有一個數字(匹配組的正確轉義)
前言
也許你想轉換這個:
aaaa
至:
1aaa1
所以讓我們提出這個建議:
echo aaaa | sed --regexp-extended 's/(.*)a/1\11/' → 1aaa1
問題
是
1\11
100% 有效的明確sed
模式嗎?我是否遵守了sed
這種替換的所有良好做法?我的意思是
1\11
可能是這兩個:
- 替換為 char
1
,然後是 1° 匹配組,然後是另一個 char1
(→ 目前行為)- 替換為 char
1
,然後是11 ° 匹配組(→ 導致異常)目前看來我的 sed 版本有第一個解釋。無論如何,我不知道這是否已記錄在案,或者是否可以在
sed
.謝謝你的澄清。同時,我不會在此基礎上建造城堡。
目前我正在使用 GNU sed 4.7。
POSIX 中有這樣一段描述:
反向引用表達式 ‘\n’ 應匹配與在 ‘\n’ 之前的 “(” 和 “)” 之間包含的子表達式匹配的相同(可能為空)字元串。字元 ’n’ 應該是一個從 1 到 9 的數字,指定第 n 個子表達式(以模式開頭的第 n 個 “(” 開始並以相應的成對 “)” 結束的子表達式)。
這將避免任何
\10
or\11
。這是 BRE 的語法,但我們不需要擔心 POSIX 中的 ERE,因為它們不允許反向引用。
GNU sed 手冊也是如此。我不相信有任何 sed 允許的不僅僅是
\1...\9
反向引用。一種允許更多反向引用的語言是 Perl。但是在那種語言中,會寫入多於一位的反向引用
${23}
。我想這樣的規定或類似規定通常用於避免混淆。
正如使用者@QuartzCristal 所說,在 GNU 的
sed
手冊頁中有這樣的註釋:s/正則表達式/替換/
嘗試將正則表達式與模式空間進行匹配。如果成功,則替換與替換匹配的部分。替換可能包含特殊字元 & 來引用匹配的模式空間部分,特殊轉義符 \1 到 \9 來引用正則表達式中相應的匹配子表達式。
來自沒有這種限制的通用程式語言(如 Perl)
1
(9
例如,您可以編寫1{$19}1
),我不知道sed
. 所以,我知道目前語法只是 100% 正確,不能以其他方式解釋。這個答案對 GNU sed 有效。不確定這是 POSIX 定義。