Eliminar un prefijo usando sed y regex

Estoy tratando de usar SED(1) para eliminar todas las apariciones de std::memset y std::memcpy con ::memset y ::memcpy. Intenté el siguiente patrón pero no funciona: solo obtengo el mismo texto.

$ sed 's/std\(::\(memset|memcpy\)\)/${\1}/g'

Básicamente quiero deshacerme de std si seguido de ::memset or ::memcpy.

preguntado el 10 de marzo de 12 a las 02:03

2 Respuestas

Use expresiones regulares extendidas en el script proporcionando la opción de línea de comando -r para GNU sed o -E para sistemas BSD como Mac OS.

linux$ sed -r 's/std(::(memset|memcpy))/\1/g' code.cpp

macos$ sed -E 's/std(::(memset|memcpy))/\1/g' code.cpp

respondido 12 mar '12, 23:03

El primero no funciona, y mi sed (OS X) no tiene -r... También estoy buscando una solución portátil. - Jake Petroules

Por favor, intente sed 's/std\(::memset\|::memcpy\)/\1/g' - kev

¿Qué hay de quitar solo el backslash(\) antes bar(|). - kev

OK, técnicamente tenías razón con -r, es solo -E en BSD. Curiosamente, FreeBSD tiene -r para compatibilidad, pero OS X no. :( - Jake Petroules

OS X sed es una bestia curiosa!

Esto funciona:

bash-3.2$ echo '
std::memset()
std::memcpy()
' | sed -E 's/std(::(memset|memcpy))/\1/g' 

::memset()
::memcpy()

(Probado en Darwin Kernel versión 11.3.0: jueves 12 de enero a las 18:47:41 PST de 2012; root:xnu-1699.24.23~1/RELEASE_X86_64)

respondido 10 mar '12, 02:03

Me parece normal. Todos mis sistemas ejecutan BSD. - cristo

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.