Estoy tratando de reformatear un archivo de registro para que la fecha y la hora aparezcan al principio de la línea. Mis registros se ven así:
blah, blah, blah, Friday, Mar 13,2015 16:59:42
yadi, yadi, yada, Friday, Mar 13,2015 16:51:11
Me gustaría que se vieran así:
Friday, Mar 13,2015 16:59:42 blah, blah, blah
Friday, Mar 13,2015 16:51:11 yadi, yadi, yada
He ido tan lejos como para encontrar el patrón grep correcto con grep -o -i -e '[a-zA-Z]*, [a-z][a-z][a-z] [0-9]*,[0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]' ~/log.txt
.
¿Cómo puedo mover estos resultados de patrón a la izquierda de la cadena de información? Gracias por tu ayuda.
Respuesta aceptada:
Prueba sed
con la siguiente expresión regular:
$ sed -i.bak 's_\(.*\),[[:blank:]]\([[:alpha:]]\+,[[:blank:]][[:alpha:]]\+[[:blank:]][[:digit:]]\+,[^,]\+$\)_\2 \1_' file.txt
Friday, Mar 13,2015 16:59:42 blah, blah, blah
Friday, Mar 13,2015 16:51:11 yadi, yadi, yada
Aquí hemos usado el sed
método de sustitución de grupo para obtener el resultado deseado.
\(.*\)
coincidirá conblah, blah, blah
como tenemos,[[:blank:]]
para hacer coincidir,
después de eso.\([[:alpha:]]\+,[[:blank:]][[:alpha:]]\+[[:blank:]][[:digit:]]\+,[^,]\+$\)
coincidirá con la parte restante de la línea (la parte que queremos poner al principio).
Entonces tenemos \2 \1
poner primero el segundo grupo y luego un espacio y luego el primer grupo.
Se realizará una copia de seguridad del archivo original como file.txt.bak
, si no quieres eso, usa solo -i
en lugar de -i.bak
.
**Aunque obtendrá el resultado deseado, usar Regex/sed no será la solución óptima en este caso.
EDITAR: Si tiene una línea como [Internet disconnected] Friday, Mar 13,2015 15:48:34
, prueba esto:
$ sed -i.bak 's_\(.*[^,]\),*[[:blank:]]\([[:alpha:]]\+,[[:blank:]][[:alpha:]]\+[[:blank:]][[:digit:]]\+,[^,]\+$\)_\2 \1_' file.txt
Friday, Mar 13,2015 15:48:34 [Internet disconnected]
Friday, Mar 13,2015 16:59:42 blah, blah, blah
Friday, Mar 13,2015 16:51:11 yadi, yadi, yada
En la expresión regular anterior teníamos \(.*\),[[:blank:]]
(una coma y un espacio en blanco después del primer grupo coincidente), ahora para incluir la nueva línea en la salida, hemos creado el primer grupo coincidente \(.*[^,]\)
para asegurarnos de que no termina con una coma y luego hemos emparejado ,*
es decir, una o más comas. Entonces, el nuevo sed
el comando funcionará para todos los casos mencionados.