Wie verwende ich den Ersatz von sed mit einem Regex-Muster als Variable?

Wie verwende ich den Ersatz von sed mit einem Regex-Muster als Variable?

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 \1bezieht 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 \2usw. \3bis verwenden \9.

Die Klammern werden maskiert. Ohne \würden sie wörtlich genommen und \1würden nicht funktionieren. Wenn Sie sed -Edann 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 sedCode für Menschen etwas lesbarer.

verwandte Informationen