你可以使用类似:
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没有出现在行 –