2011-03-15 21 views
5

que utiliza este comando:cambio dos últimos dígitos de un número usando sed

sed 's/;\([0-9]*\),\([0-9]*\);/;\1.\2;/g;s/;\(\r\?\)$/\1/' inputfile 

para cambiar enormes archivos CSV a mis necesidades (véase delete ';' at the end of each line).

Ahora sucede que en algunos archivos csv hay "fechas ficticias" como 20000500 que no se pueden importar a SQL debido a los dos últimos ceros (que no son posibles para las fechas).

¿Cómo puedo editar mi comando sed para cambiar siempre los últimos dos dígitos a 01 en tales casos (me refiero solo si son 00)?

me trataron

sed 's/;\([0-9]*\),\([0-9]*\);/;\1.\2;/g;s/;\([0-9]{6}\)00;/;\101;/g;s/;\(\r\?\)$/\1/' inputfile 

pero eso no funciona.

Respuesta

6

Creo que {6} es una expresión regular extendida. Entonces, o tiene que usar sed -r o cambia su expresión regular a s/;\([0-9][0-9][0-9][0-9][0-9][0-9]\)00;/;\101;/g.

Si desea utilizar expresiones regulares extendidas, hacer:

sed -r 's/;([0-9]{6})00;/;\101;/g' 

es decir .: usted tiene que quitar las barras invertidas de parens.

Editar: Con respecto al comentario de Dennis Williamson también es posible usar expresiones regulares regulares escapando de las llaves:

sed 's/;\([0-9]\{6\}\)00;/;\101;/g' 
+3

Como alternativa, podría escapar de las llaves. –

+0

que funciona! ¡¡¡muchas gracias!!! – speendo

+2

Gracias Dennis, ese es un buen punto. También agregaré esto a mi respuesta. – bmk

Cuestiones relacionadas