Estoy usando sed para buscar y reemplazar patrones dentro de los archivos SAS que tengo en lugar de cambiarlos individualmente. El problema es que estoy tratando de reemplazar variables macro y cuando uso los ampers y no se procesa correctamente.
Here's my code:
sed -ie 's/user=&uid./user=&sysuserid./g' *_table_*.sas
cada vez que ejecuto este comando parece agregar y hacer todo tipo de cosas funky con el texto original.
Pregunta: ¿Cómo reemplazo el texto que contiene símbolos con comando sed?
&
es un personaje especial, por lo que debe escaparse cuando se usa en el RHS; en su caso, debe correr,'s/user=&uid./user=\&sysuserid./g'
aunque sospecho que también necesita escapar del punto en el LHS para que coincida con un punto literal, por lo que realmente necesita's/user=&uid\./user=\&sysuserid./g'
Respuestas:
&
es especial en el texto de reemplazo: significa “toda la parte de la entrada que se corresponde con el patrón”, así que lo que estás haciendo aquí reemplazauser=&uidX
conuser=user=&uidXsysuserid.
. Para insertar un ampersand real en el texto de reemplazo, use\&
.Otra cosa que parece incorrecta es que
.
en el patrón de búsqueda se encuentra cualquier carácter (excepto una nueva línea), pero.
al final del texto de reemplazo hay un punto literal. Si desea reemplazar solo la cadena literaluser=&uid.
, protéjala.
con una barra diagonal inversa.Si desea reemplazar cualquier carácter y preservarlo en el resultado, coloque el carácter en un grupo y úselo
\1
en el reemplazo para referirse a ese grupo.De hecho, dada la repetición entre el texto original y el reemplazo, debería usar grupos de todos modos:
es decir, "reemplazar
u
porsysuser
entreuser=&
yid.
".fuente
\(user=&\)
es un patrón que coincideuser&
y almacena la cadena de coincidencia como un grupo (grupo número 1 ya que es el primer grupo en el patrón). Luego, en el reemplazo\1
se reemplaza por la cadena almacenada para el grupo número 1.=
en las expresiones regulares y en el texto de reemplazo se representa a sí mismo, por lo queuser=&
solo coincideuser=&
, yuser=&
en el texto de reemplazo se obtieneuser=
la parte de la línea que coincide con la expresión regular.=
personaje no tiene ningún significado especial.user=&
en el texto de reemplazo produceuser=
seguido por el texto original coincidente.user=\&
en el texto de reemplazo produceuser=&