GNU/Linux >> Tutoriales Linux >  >> Ubuntu

¿Mover patrón al comienzo de la línea?

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á con blah, 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.

Relacionado:¿Se agota el tiempo de espera de Sudo durante una secuencia de comandos de ejecución prolongada?
Ubuntu
  1. Uso de Sed para buscar y reemplazar una línea entre rangos de patrones

  2. Cómo insertar texto al comienzo de cada línea en Vim

  3. ¿Cómo mover una línea en un archivo de texto hacia arriba o hacia abajo una línea?

  4. ¿Encontrar patrón y mover?

  5. ¿Reemplazar el patrón después de encontrar la enésima coincidencia en cada línea?

Cómo mover directorios en Linux

Cómo mover las notificaciones de GNOME Shell

Cómo realizar una búsqueda de patrones en archivos usando Grep

Cómo mover un directorio en Linux

¿Reproductores de audio de línea de comandos?

Agregue una cadena de prefijo al comienzo de cada línea