Ver Mensaje Individual
  #1 (permalink)  
Antiguo 21/03/2009, 07:01
Avatar de -Defero-
-Defero-
Colaborador
 
Fecha de Ingreso: julio-2004
Ubicación: Guipúzcoa
Mensajes: 4.776
Antigüedad: 20 años, 4 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