Nehmen wir an, wir haben Folgendes als Standardeingabe (als Beispiel):
Life is temporary
Ich möchte, dass sed dies ersetzt durch
Life is permanent
mit einem Befehl etwa in der Art von
sed 's/Life<%XY=.*>temporary/Life%XYpermanent'
Natürlich weiß ich, dass der obige Befehl nicht gültig ist, er soll als Beispiel dienen. Ich möchte alles, was .*
passt, in einer Variablen speichern und diese Variable in der Ersetzungszeichenfolge abrufen.
Antwort1
sed 's/Life\(.*\)temporary/Life\1permanent/'
Hier \1
bezieht sich auf das erste Klammernpaar im Muster. In diesem Fall ist es das einzige Paar, aber im Allgemeinen können Sie mehrere Paare haben und dann \2
usw. \3
bis verwenden \9
.
Die Klammern werden maskiert. Ohne \
würden sie wörtlich genommen und \1
würden nicht funktionieren. Wenn Sie sed -E
dann verwenden, wird es umgekehrt: (
ist speziell und \(
bezeichnet einen Literalwert (
(beachten Sie, dass dies im Allgemeinen nicht der einzige Unterschied ist -E
):
sed -E 's/Life(.*)temporary/Life\1permanent/'
Diese Änderung macht unseren sed
Code für Menschen etwas lesbarer.