Sie können einfach etwas verwenden wie:
sed 's/foo/barfoo/g' baz
(die g
am Ende bedeutet global, jedes Vorkommen in jeder Zeile und nicht nur das erste).
Für ein willkürlich (statt eines festen) Musters wie foo[0-9]
können Sie Erfassungsgruppen wie folgt verwenden:
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
Die Klammern erfassen den tatsächlichen Text, der mit dem Muster übereinstimmt, und die \1
verwendet es bei der Substitution.
Sie können beliebig komplexe Muster verwenden und dabei auch sicherstellen, dass nur vollständige Wörter übereinstimmen. Ändern Sie zum Beispiel das Muster nur, wenn es unmittelbar von einer Wortgrenze umgeben ist:
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
In Bezug auf die Funktionsweise der Erfassungsgruppen können Sie Klammern verwenden, um den Text, der mit einem Muster übereinstimmt, zur späteren Verwendung in der Ersetzung zu speichern. Die erfassten Bezeichner basieren auf dem (
Zeichen von links nach rechts zu lesen, so dass die Regex (ich habe das \
Escape-Zeichen entfernt und der Übersichtlichkeit halber ein wenig aufgefüllt):
( ( \S* ) ( \S* ) )
^ ^ ^ ^ ^ ^
| | | | | |
| +--2--+ +--3--+ |
+---------1---------+
bei Anwendung auf den Text Pax Diablo
würden Sie drei Gruppen erhalten:
\1 = Pax Diablo
\2 = Pax
\3 = Diablo
wie unten dargestellt:
pax$ echo 'Pax Diablo' | sed 's/\(\(\S*\) \(\S*\)\)/[\1] [\2] [\3]/'
[Pax Diablo] [Pax] [Diablo]