regular pattern online regex sed

pattern - regex en sed



sed replace string (7)

Necesito usar sed para convertir todas las ocurrencias de ## XXX ## a $ {XXX}. X podría ser cualquier carácter alfabético o ''_''. Sé que necesito usar algo como:

''s/##//${/g''

Pero, por supuesto, eso no funcionará correctamente, ya que convertirá a ## FOO ## en $ {FOO $ {

¿Ningún arrendatario? - Don


Aquí hay una oportunidad de una mejor regex de reemplazo:

''s/##/([a-zA-Z_]/+/)##/${/1}/g''

O si asumes exactamente tres caracteres:

''s/##/([a-zA-Z_]/{3/}/)##/${/1}/g''


Utilizar esta:

s/##/([^#]*/)##/${/1}/

Por cierto, no hay necesidad de escapar $ en el lado derecho del operador "s".


  • Encapsule el alfa y ''_'' dentro de ''/ ('' y ''/)'' y luego en el lado derecho haga referencia a eso con ''/ 1''.
  • ''+'' para unir uno o más alfa y ''_'' (en caso de que vea ####).
  • Agregue la opción ''g'' al final para reemplazar todas las coincidencias (que supongo que es lo que quiere hacer en este caso).

''s/##/([a-zA-Z_]/+/)##/${/1}/g''


sed ''s/##/([a-zA-Z_][a-zA-Z_][a-zA-Z_]/)##/${/1}/''

El /(.../) recuerda ... y se hace referencia como /1 en la expansión. Use comillas simples para guardar su cordura.

Como se señala en los comentarios a continuación, esto también se puede contratar para:

sed ''s/##/([a-zA-Z_]/{3/}/)##/${/1}/''

Esta respuesta supone que el ejemplo quería exactamente tres caracteres combinados. Hay múltiples variaciones dependiendo de lo que hay entre las marcas de almohadilla. La parte clave es recordar parte de la cadena coincidente.


echo ''## XXX ##'' | sed "s / ^ ## ([^ #] *) / ## $ {/ 1} / g"


sed ''s / ([^ az] [^ AZ] [^ 0-9] *) / (&) / pg


echo "##foo##" | sed ''s/##/${/;s//}/''

  • s cambiar solo 1 ocurrencia por defecto
  • s// toma el último patrón de búsqueda utilizado, así que la segunda s toma también ## y solo existe la segunda ocurrencia