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 den([^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.