Filtrado de entrada con sed (regex)


1

Tengo un problema con sed que no devuelve lo que esperaba cuando uso un patrón regex para limpiar algunos resultados de una consulta mysql.

mysql -uroot -p -e 'SELECT `path` FROM db.media_gallery' | sed -n -r 's/[^\/]+([^\s]+).*/\1/p'

La consulta devuelve un montón de filas como estas:

| /media/M/W/lmt_MWS04_8.png    |
| /media/M/W/lmt_MWS02_11.png   |

Cuando canalizo esto a través del comando sed mencionado anteriormente, devuelve esto:

//M/W/lmt_MWS04_8.png
//M/W/lmt_MWS02_11.png

¿A dónde fueron los "medios"? ¿Por qué elimina al azar una parte de mi cadena?

¿Alguien sabe cómo arreglar mi expresión regular?


"medios" desaparece porque coincide con la [^\/]+parte de su expresión regular, que no está incluida en su salida. No podemos arreglar su expresión regular a menos que sepamos lo que estaba tratando de hacer. ¿Estás tratando de recortar espacios en blanco?
wingedsubmariner

Respuestas:


3

No es necesario sed, el verdadero problema es que está utilizando la salida predefinida de mysql que está destinada al consumo humano en lugar de al automatizado. Esta es una tarea simple de la que mysql es más que capaz.

mysql -N -s -r -uroot -p -e 'SELECT `path` FROM db.media_gallery'

volverá:

/media/M/W/lmt_MWS04_8.png
/media/M/W/lmt_MWS02_11.png

de 'man mysql':

--skip-column-names, -N
--silent, -s
--raw, -r

0

El "medio" coincidía con "[^ /] +", por lo que fue reemplazado por las cosas entre paréntesis. Si lo desea, debe abrir los paréntesis antes de la cláusula regex.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.