Foros del Web » Administración de Sistemas » Unix / Linux »

SED: cómo "escapar" las comillas simples

Estas en el tema de SED: cómo "escapar" las comillas simples en el foro de Unix / Linux en Foros del Web. Quiero clasificar una serie de imágenes a través de una base de datos MySQL, y para eso lo primero que quiero hacer es introducir los ...
  #1 (permalink)  
Antiguo 21/03/2009, 07:01
Avatar de -Defero-
Colaborador
 
Fecha de Ingreso: julio-2004
Ubicación: Guipúzcoa
Mensajes: 4.776
Antigüedad: 19 años, 9 meses
Puntos: 76
SED: cómo "escapar" las comillas simples

Quiero clasificar una serie de imágenes a través de una base de datos MySQL, y para eso lo primero que quiero hacer es introducir los datos más básicos, que son el nombre, la descripción y el tamaño. De momento en el lugar de la descripción irá lo mismo que en el campo del nombre. La sentencia SQL sería así:

Código:
INSERT INTO `fotos` (`referencia`, `nombre`, `descripcion`, `tamanio`) VALUES (NULL, 'nombre', 'nombre', 'tamaño');
La cuestión es que son un buen puñado de archivos, así que quiero construir esa sentencia SQL de manera automatizada, a través de la consola de comandos. Lo planteo de la siguiente manera:

1.- Mediante LS saco toda la información que necesito: el nombre y el tamaño.

Código:
ls *.jpg -l -h
2.- Mediante una tubería, paso el resultado al siguiente comando:

Código:
|
3.- Mediante AWK extraigo del comando anterior la información que me interesa, desechando todo lo demás.

Código:
awk  '{ print $8 , $5 }'
4.- Mediante una tubería, paso el resultado al siguiente comando:

Código:
|
5.- Mediante SED, cojo el resultado anterior, le quito la extensión JPG al nombre del archivo, y meto el nombre en \1 y el tamaño en \2:

Código:
sed -r 's/^(.*)\.jpg (.*)$/INSERT INTO \`fotos\` \(\`referencia\`\, \`nombre\`\, \`descripcion\`\, \`tamanio\`\) VALUES \(NULL\, \'\1\'\, \'\1\'\, \'\2\'\)\;/g'
Luego el resultado lo vuelco a un archivo SQL que importaré mediante PHPMyAdmin.

La teoría está bien. Pero ahora la práctica. Las comillas simples que envuelven a \1 y a \2 me dan problemas. Si las escapo mediante una barra, de la siguiente manera:

Código:
\'\1\'
No sé qué efecto raro produce, que da la sensación de que no encuentra el final de la expresión regular al llegar a /g', y me da un error al encontrarse con la siguiente línea del script:

Código:
./generar_indices.sh: line 9: syntax error near unexpected token `<'
Ese caracter que dice que está mal es el número 985 de la línea siguiente a la que contiene el comando SED.

Sin embargo, si no "escapo" las comillas simples:

Código:
'\1'
El script se ejecuta correctamente, hace todo lo que se espera de él... salvo por el hecho de que me genera la siguiente sentencia SQL:

Código:
INSERT INTO `fotos` (`referencia`, `nombre`, `descripcion`, `tamanio`) VALUES (NULL, 1, 1, 2);
Donde aparece el valor "1" debería aparecer el nombre del archivo, y donde aparece el valor "2" debería aparecer el tamaño en MB.

En resumen, si "escapo" las comillas, la ejecución del comando falla. Si no las escapo, el comando funciona pero no me "traduce" \1 y \2. ¿Alguien sabe qué estoy haciendo mal? ¿Debería "escapar" las comillas de algún otro modo?
__________________
abogado en Errenteria + procuradora en San Sebastián = equipo imparable
  #2 (permalink)  
Antiguo 21/03/2009, 07:27
Avatar de -Defero-
Colaborador
 
Fecha de Ingreso: julio-2004
Ubicación: Guipúzcoa
Mensajes: 4.776
Antigüedad: 19 años, 9 meses
Puntos: 76
Respuesta: SED: cómo "escapar" las comillas simples

Solución: sustituir en el script las comillas simples escapadas por comillas dobles escapadas. Es decir, esto:

Código:
sed -r 's/^(.*)\.jpg (.*)$/INSERT INTO \`fotos\` \(\`referencia\`\, \`nombre\`\, \`descripcion\`\, \`tamanio\`\) VALUES \(NULL\, \'\1\'\, \'\1\'\, \'\2\'\)\;/g'
Por esto:

Código:
sed -r 's/^(.*)\.jpg (.*)$/INSERT INTO \`fotos\` \(\`referencia\`\, \`nombre\`\, \`descripcion\`\, \`tamanio\`\) VALUES \(NULL\, \"\1\"\, \"\1\"\, \"\2\"\)\;/g'
Y así funciona. No me preguntéis por qué.
__________________
abogado en Errenteria + procuradora en San Sebastián = equipo imparable
  #3 (permalink)  
Antiguo 21/03/2009, 18:58
Avatar de arthpix  
Fecha de Ingreso: diciembre-2003
Ubicación: Cancún
Mensajes: 2.340
Antigüedad: 20 años, 4 meses
Puntos: 93
Respuesta: SED: cómo "escapar" las comillas simples

No te pregunto, pero creo que es por que si usas solamente comillas simples las sentencias se "cierran" en lugar incorrecto. Algo similar pasa si con php escribes:
Código PHP:
echo "<a href="url">Link</a>"
Lo correcto es:
Código PHP:
echo '<a href="url">Link</a>'

Saludos
__________________
Antes de hacer rabietas infórmate: Linux != Windows
  #4 (permalink)  
Antiguo 21/03/2009, 19:12
Avatar de -Defero-
Colaborador
 
Fecha de Ingreso: julio-2004
Ubicación: Guipúzcoa
Mensajes: 4.776
Antigüedad: 19 años, 9 meses
Puntos: 76
Respuesta: SED: cómo "escapar" las comillas simples

Ya, pero se supone que para eso se usa la barra, para decir "trata el siguiente caracter como un caracter más, no le atribuyas el valor especial que suele tener en este script". También el punto y el paréntesis tienen significados especiales, y poniendo la barra delante se soluciona el tema.
__________________
abogado en Errenteria + procuradora en San Sebastián = equipo imparable
  #5 (permalink)  
Antiguo 21/03/2009, 19:32
Avatar de -Defero-
Colaborador
 
Fecha de Ingreso: julio-2004
Ubicación: Guipúzcoa
Mensajes: 4.776
Antigüedad: 19 años, 9 meses
Puntos: 76
Respuesta: SED: cómo "escapar" las comillas simples

Y digo yo... en vez de pasarlo de AWK a SED... ¿no podría haberlo hecho todo desde AWK? Seguramente sí...
__________________
abogado en Errenteria + procuradora en San Sebastián = equipo imparable
  #6 (permalink)  
Antiguo 21/03/2009, 20:45
Avatar de arthpix  
Fecha de Ingreso: diciembre-2003
Ubicación: Cancún
Mensajes: 2.340
Antigüedad: 20 años, 4 meses
Puntos: 93
Respuesta: SED: cómo "escapar" las comillas simples

Cita:
Iniciado por Defero.tk Ver Mensaje
Ya, pero se supone que para eso se usa la barra, para decir "trata el siguiente caracter como un caracter más, no le atribuyas el valor especial que suele tener en este script". También el punto y el paréntesis tienen significados especiales, y poniendo la barra delante se soluciona el tema.
Se supone, lo mismo que en php. Pero yo tuve alguna vez un problema similar en php y tuve que usar los dos tipos de encomillado.
__________________
Antes de hacer rabietas infórmate: Linux != Windows
  #7 (permalink)  
Antiguo 22/03/2009, 07:03
Avatar de -Defero-
Colaborador
 
Fecha de Ingreso: julio-2004
Ubicación: Guipúzcoa
Mensajes: 4.776
Antigüedad: 19 años, 9 meses
Puntos: 76
Respuesta: SED: cómo "escapar" las comillas simples

Lo guardaremos en el cajón de los "misterios sin respuesta".
__________________
abogado en Errenteria + procuradora en San Sebastián = equipo imparable
  #8 (permalink)  
Antiguo 22/03/2009, 09:18
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: SED: cómo "escapar" las comillas simples

Cita:
Iniciado por Defero.tk Ver Mensaje
Y digo yo... en vez de pasarlo de AWK a SED... ¿no podría haberlo hecho todo desde AWK? Seguramente sí...
Y con
Código:
stat -c %n-%s *.jpg
podrías obtener esos datos de una forma más sencilla (aunque tendrías que abrir un proceso por cada .jpg).
Pero ya sabemos que hay muchas formas de hacer lo mismo (y además no necesariamente funcionaría en un sistema diferente a GNU/Linux, por lo menos en AIX no funciona.)

Hace poco me encontré un script que analizaba la salida de ls -l para descubrir si el usuario tenía permisos de escritura sobre un directorio. No recuerdo si eran 3 o 4 las comprobaciones, eran unas 10 líneas de código. Cuando hablé con el autor, ni siquiera sabía (él) de la existencia de la opción -w de [

Mini conclusión: a menos que tengas un problema de rendimiento, si funciona está bien. Siempre habrá un gurú que pueda hacer lo mismo de forma más rápida, más sencilla o ambas


Saludos.
  #9 (permalink)  
Antiguo 22/03/2009, 09:30
Avatar de -Defero-
Colaborador
 
Fecha de Ingreso: julio-2004
Ubicación: Guipúzcoa
Mensajes: 4.776
Antigüedad: 19 años, 9 meses
Puntos: 76
Respuesta: SED: cómo "escapar" las comillas simples

Cita:
Iniciado por alvlin Ver Mensaje
(...) no necesariamente funcionaría en un sistema diferente a GNU/Linux, por lo menos en AIX no funciona (...) a menos que tengas un problema de rendimiento, si funciona está bien (...)
Es un script casero de "un solo uso", que no sólo no será útil a nadie más, es que seguramente yo mismo no lo volveré a usar nunca jamás. Así que la "portabilidad del código" no es lo que más me preocupa. Y el rendimiento... si tarda 30 segundos en vez de 20 (tanta demora es debida a que modifica el tamaño de las imágenes con MOGRIFY), creo que podré vivir con ello.
__________________
abogado en Errenteria + procuradora en San Sebastián = equipo imparable
  #10 (permalink)  
Antiguo 03/02/2010, 08:36
 
Fecha de Ingreso: septiembre-2004
Mensajes: 407
Antigüedad: 19 años, 7 meses
Puntos: 1
Respuesta: SED: cómo "escapar" las comillas simples

como se podria escapar la "/"

ejemplo que tenga un txt que diga /etc/ u me quede con por ejemplo +t+ como es logica del espace en sed?
__________________
Mas vale morir de pie que vivir de rodillas :ojotes:
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 16:21.