Как использовать замену sed с шаблоном регулярного выражения в качестве переменной?

Как использовать замену sed с шаблоном регулярного выражения в качестве переменной?

Допустим, у нас есть следующее в качестве stdin (в качестве примера):

Life is temporary

Я хочу, чтобы sed заменил это на

Life is permanent

с командой где-то в духе

sed 's/Life<%XY=.*>temporary/Life%XYpermanent'

Конечно, я знаю, что вышеприведенная команда недействительна, она приведена в качестве примера. Я хочу сохранить все, что .*соответствует, в переменную и хочу вызвать эту переменную в строке замены.

решение1

sed 's/Life\(.*\)temporary/Life\1permanent/'

Здесь \1относится к первой паре скобок в шаблоне. Это единственная пара в этом случае, но в целом вы можете иметь больше пар, а затем вы можете использовать и т. д. \2, \3до \9.

Скобки экранированы. Без \них они воспринимались бы буквально и \1не работали бы. Если вы используете sed -Eто это будет наоборот: (будет специальным и \(будет обозначать литерал ((заметьте, в общем, это не единственное различие -E):

sed -E 's/Life(.*)temporary/Life\1permanent/'

Это изменение делает наш sedкод более читабельным для людей.

Связанный контент