GNU/Linux >> Tutoriales Linux >  >> Linux

¿Fusionar 3 líneas consecutivas con intercambio?

Oye, necesito fusionar tres líneas consecutivas con intercambio entre la segunda y la tercera línea en 'archivo':

$cat file
Object Name: A
    comments: comment A
    manual_encdomain: Name: A 
Object Name: B
    comments: comment B
    manual_encdomain: Name: B 

Entonces, en lugar de la salida a continuación:

$sed 'N;N;s/n/ /g' file 
Object Name: A comments: comment A manual_encdomain: Name: A 
Object Name: B comments: comment B manual_encdomain: Name: B

Prefiero necesitar esto

Object Name: A manual_encdomain: Name: A comments: comment A
Object Name: B manual_encdomain: Name: B comments: comment B

sed, awk cualquier cosa

Respuesta aceptada:

Sí, puedes usar sed para intercambiar líneas:

$ sed -E 'N;N;s/n([^n]*)n([^n]*)/ 2 1/' file
Object Name: A     manual_encdomain: Name: A      comments: comment A
Object Name: B     manual_encdomain: Name: B      comments: comment B

O, equivalentemente:

$ sed  'N;N;s/n([^n]*)n([^n]*)/ 2 1/g' file
Object Name: A     manual_encdomain: Name: A      comments: comment A
Object Name: B     manual_encdomain: Name: B      comments: comment B

Cómo funciona:

  • -E

    Esto activa las expresiones regulares extendidas. (-E funciona tanto en BSD (OSX) sed como en GNU sed moderno. Para versiones anteriores de GNU sed, use -r en su lugar.)

    Sin expresiones regulares extendidas, necesitamos escapar ( y ) como se muestra arriba.

  • N;N

    Esto se lee en la segunda y tercera líneas.

  • s/n([^n]*)n([^n]*)/ 2 1/

    Esto intercambia la segunda y la tercera línea. La primera ocurrencia de n([^n]*) captura la segunda línea y la guarda en el grupo de captura 1. La segunda ocurrencia de n([^n]*) captura la tercera línea y la guarda en el grupo de captura 2. El texto de reemplazo, 2 1 cambia la posición mientras reemplaza las nuevas líneas con espacios.

Quitar algunos espacios en blanco sobrantes

Las líneas segunda y tercera están sangradas en el archivo de entrada. Si queremos eliminar ese espacio en blanco adicional:

$ sed -E 'N;N;s/n[[:blank:]]*([^n]*)n[[:blank:]]*([^n]*)/ 2 1/g' file
Object Name: A manual_encdomain: Name: A  comments: comment A
Object Name: B manual_encdomain: Name: B  comments: comment B

[[:blank:]] es la forma segura de Unicode de hacer coincidir espacios en blanco y tabulaciones.


Linux
  1. ¿Fusionar carpetas con Mv?

  2. ¿Insertar nuevas líneas con valores faltantes (na)?

  3. ¿Usando Word Wrap con Mc?

  4. Instalar phpList con Softaculous

  5. `npm install` termina con Killed

Cómo implementar una aplicación de varios niveles con Kubernetes

Administre la seguridad de la red con Firewalld usando líneas de comando

Primeros pasos con los libros de jugadas de Ansible

Instalación de OpenCart 2.0 con Softaculous

Problemas con la fusión de cuentas de cPanel

Cómo restar filas (líneas) con AWK