Вы можете просто использовать что-то вроде:
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
Что касается работы групп захвата, вы можете использовать скобки для хранения текста, соответствующего шаблону, для последующего использования при замене. Захваченные идентификаторы основаны на чтении символов (
слева направо, поэтому регулярное выражение (я отбросил управляющие символы \
и немного добавил его для ясности):
( ( \S* ) ( \S* ) )
^ ^ ^ ^ ^ ^
| | | | | |
| +--2--+ +--3--+ |
+---------1---------+
применительно к тексту Pax Diablo
даст вам три группы:
\1 = Pax Diablo
\2 = Pax
\3 = Diablo
как показано ниже:
pax$ echo 'Pax Diablo' | sed 's/\(\(\S*\) \(\S*\)\)/[\1] [\2] [\3]/'
[Pax Diablo] [Pax] [Diablo]