¿Cómo reemplazar una línea vacía con la línea debajo?

¿Cómo reemplazar una línea vacía con la línea debajo?

He analizado un archivo pero hay algún problema y una forma rápida de solucionarlo es reemplazar la línea vacía con la línea debajo, entonces, ¿cómo lo hago?

como el siguiente archivo

apple

banana
big
sig

cake

debe convertirse a

apple
banana
banana
big
sig
cake
cake

Respuesta1

Con sed:

sed -ne '/./!{n;p;}' -e p your-file

/./! actionejecuta la acción (aquí recupera la nlínea ext yp la imprime) para las líneas que lo hacenno( !) contiene un solo carácter ( .es el operador de expresiones regulares que coincide con cualquier carácter).

Algunas sedimplementaciones también tienen una opción -io -i ''para editar el archivo in situ.

Respuesta2

Puedes hacer esto awkcon su getline()función. El comando funciona seleccionando las líneas vacías en el archivo de texto !NF, es decir, aquellas líneas que están vacías (el número de campos dentro de la línea es 0). Utilizando elgetline() función obtenemos elpróximolínea inmediata de la línea vacía y almacenar en la variable nxt.

awk '!NF && ((getline nxt) >0){ $0 = nxt ORS nxt }1' file

Luego, la parte interna {..}construye una línea que combina la variable, una nueva línea incrustada (concatenación de cadenas con ORS) y la variable nuevamente. El segundo anexo es necesario porque getline()la llamada de forma predeterminada avanza el puntero de línea un nivel. Ver¿Cómo cambiar permanentemente un archivo usando awk? (ediciones "in situ", como con "sed -i")para cambiar el archivo dinámicamente.

Respuesta3

$ awk '/^$/ { ++r; next } { print; for (i=0; i<r; ++i) print; r=0 }' file
apple
banana
banana
big
sig
cake
cake

o

awk '/^$/ { ++r; next } { print; while (r > 0) { print; --r } }' file

lo que da el mismo resultado.

Esto imprime cada línea 1 vez, más el número de veces correspondiente al número de líneas en blanco encima de ella. Las líneas en blanco se cuentan en la variable r.

Las líneas en blanco se detectan con la expresión regular ^$, pero también puedes usar length == 0o NF == 0.

Respuesta4

Puede hacer esto de la siguiente manera:

$ sed -e ' /^$/{$!N' -e '}' -e 's/\n//p' inp

información relacionada