¿Cómo hacer coincidir un literal '*' con sed?

¿Cómo hacer coincidir un literal '*' con sed?

Tengo esta línea en mi archivo llamado test.php

'dbs_password' => 'a8b*cyP0',

y quiero reemplazar en:

'dbs_password' => 'password-here',

Entonces uso este sedcomando con sintaxis:

$ sed -e "s:'dbs_password' => 'a8b*cyP0',:'dbs_password' => 'password-here':" -i test.php

Sin embargo, no cambia ni es reemplazado.

Le agradecería que alguien pudiera compartir algún conocimiento sobre la forma correcta de utilizar sedeste tipo de código.

Respuesta1

El problema es que *en expresiones regulares significa 0 or more of the preceeding character, no significa literal *. Para hacer coincidir a *, necesitasescaparél. Por ejemplo:

sed -i "s:'dbs_password' => 'a8b\*cyP0',:'dbs_password' => 'password-here':" test.php

Sin embargo, esto es innecesariamente complejo. Si quieres reemplazartodas las ocurrenciasde la cadena a8b*cyP0con password-here, simplemente puedes hacer:

sed -i "s:a8b\*cyP0:password-here:" test.php

Si quieres reemplazarsoloesas líneas que coinciden dbs_password, haz:

sed -i "s:\(.*dbs_password.*\)'a8b\*cyP0':\1'password-here':" test.php

Este último hace uso decaptura de patronespara evitar imprimir el mismo patrón dos veces.

información relacionada