你可以使用類似:
sed 's/foo/barfoo/g' baz
(該g
末意味着全球性的,在每行每一次出現,而不是僅僅是第一)。
對於任意(而不是固定的)模式,如foo[0-9]
,你可以使用捕捉組如下:
pax$ echo 'xyz fooA abc
xyz foo5 abc
xyz fooB abc' | sed 's/\(foo[0-9]\)/bar\1/g'
xyz fooA abc
xyz barfoo5 abc
xyz fooB abc
括號捕捉匹配模式的實際文本和\1
使用它在替代。
你可以使用這個任意複雜的模式,包括確保你只匹配完整的單詞。例如,只有變着花樣如果它立即由字邊界包圍:
pax$ echo 'xyz fooA abc
xyz foo5 abc foo77 qqq xfoo4 zzz
xyz fooB abc' | sed 's/\(\bfoo[0-9]\b\)/bar\1/g'
xyz fooA abc
xyz barfoo5 abc foo77 qqq xfoo4 zzz
xyz fooB abc
在捕獲組是如何工作的,你可以使用括號來存儲供以後使用相匹配的模式文本條款在更換。捕獲的標識是基於(
人物從左至右,所以正則表達式(我已經離開了\
轉義字符和填充有點爲清楚起見):當應用到文本Pax Diablo
((\S*) (\S*))
^^ ^^ ^^
| | | | | |
| +--2--+ +--3--+ |
+---------1---------+
如下圖所示
\1 = Pax Diablo
\2 = Pax
\3 = Diablo
:會給你三個組
pax$ echo 'Pax Diablo' | sed 's/\(\(\S*\) \(\S*\)\)/[\1] [\2] [\3]/'
[Pax Diablo] [Pax] [Diablo]
實際上我想追加匹配模式之前的字符串,有沒有辦法做到這一點? –
甚至是'sed's/^ foo/bar&/''。 –
好吧,foo沒有出現在行 –