¿Cómo utilizar el sustituto de sed con un patrón de expresiones regulares como variable?

¿Cómo utilizar el sustituto de sed con un patrón de expresiones regulares como variable?

Digamos que tenemos lo siguiente como stdin (como ejemplo)

Life is temporary

Quiero que sed reemplace esto con

Life is permanent

con un comando en algún lugar parecido a

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

Eso sí, sé que lo anterior no es un comando válido, es para que sirva de ejemplo. Quiero almacenar todo lo que .*coincida en una variable y quiero recuperar esa variable en la cadena de reemplazo.

Respuesta1

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

Aquí \1se refiere al primer par de paréntesis del patrón. Es el único par en este caso, pero en general puedes tener más pares y luego puedes usar \2, \3etc., hasta \9.

Los paréntesis están escapados. Sin \ellos se tomarían literalmente y \1no funcionarían. Si lo usa sed -E, se invertirá: (será especial y \(denotará un literal ((tenga en cuenta que, en general, no es la única diferencia -E):

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

Este cambio hace que nuestro sedcódigo sea algo más legible para los humanos.

información relacionada