Fusionando 3 líneas consecutivas con swap

Hola, necesito fusionar tres líneas consecutivas con el intercambio entre la segunda y la tercera línea en 'file':

$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 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 algo

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 equivalente:

 $ 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 expresiones regulares extendidas. ( -E funciona tanto en BSD (OSX) sed como en GNU sed moderno. Para versiones anteriores de GNU sed, use -r lugar).

    Sin expresiones regulares extendidas, necesitamos escaping ( 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 tercera líneas. La primera aparición de \n([^\n]*) captura la segunda línea y la guarda en el grupo de captura 1. La segunda aparición de \n([^\n]*) captura la tercera línea y la guarda en el grupo de captura 2. El text de reemploop, \2 \1 intercambia la position al replace las líneas nuevas con espacios.

Eliminar un exceso de espacio en blanco

La segunda y tercera líneas están sangradas en el file de input. 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 para unicode de hacer coincidir espacios en blanco y tabs.

con awk:

 awk '{line1=$0; getline line2; getline line3; print line1, line3, line2}' file 

Con ex y printf :

 printf '%s\n' 'g/^O/+m +2' 'g/^O/j 3' %p | ex file.txt 

Cambia el %p por una x para save los cambios cuando estés satisfecho con la salida.


g lobally, en las líneas que comienzan ( ^ ) con una O mayúscula, mueva ( m ) la siguiente línea ( + ) a después de la segunda línea siguiente ( +2 ).

Luego, globalmente, en cada línea que comienza con O, une tres líneas.

Imprime todas las líneas %p .

O bien, guarde y salga x .