Tengo un documento con muchas líneas vacías.
¿Cómo puedo eliminarlos cuando hay 2 o más juntos?
Intenté el sed "s/\n\n//"
archivo pero no funcionó. No hay error.
Tengo un documento con muchas líneas vacías.
¿Cómo puedo eliminarlos cuando hay 2 o más juntos?
Intenté el sed "s/\n\n//"
archivo pero no funcionó. No hay error.
Respuestas:
Solo para eliminar líneas vacías:
sed '/^$/d'
sed
está orientado a líneas, por lo que pensar en términos de "2 o más de un byte particular" funciona, excepto cuando ese byte es una nueva línea. Entonces tienes que pensar en algo que funcione para toda la línea.
sed
es capaz de manejar varias líneas a través de su función "espacio de patrón" / "espacio de espera". Pero siento que es demasiado complicado. ;-)
1!
(que coincida con todos, excepto la línea 1), de este modo: sed '1!{/^$/d'}
.
sed
. La creación de un archivo esencialmente eliminará cualquier archivo existente con el mismo nombre. sed '/^&/d' file.txt > otherfile.txt
trabajará.
No hay necesidad de sed
. grep
hará:
grep .
(es decir grep
, SPC, punto, es decir, coincide con cualquier línea que contenga al menos un carácter).
También hay:
tr -s '\n'
(exprima cualquier secuencia de caracteres de nueva línea en uno).
Como señaló Chris, ambos no son equivalentes porque eliminar líneas vacías (como la primera solución anterior y la mayoría de las otras respuestas se centran aquí) no es lo mismo que exprimir secuencias de caracteres de nueva línea como se solicita en el caso donde la primera línea está vacía. solo se necesita un carácter de nueva línea para dejar vacía la primera línea.
Habiendo visto la respuesta de @Bruce Ediger, sed
no es la mejor herramienta para eso, ya que se basa en líneas y trata \n
como el carácter de final de línea, esto se complica.sed
puede ser la herramienta perfecta para el trabajo, aún así, aquí hay algunas otras opciones:
Perl
perl -ne 'print if /./' file.txt
o
perl -pe '$/=""; s/\n+/\n/;' file.txt
Gracias a @ruakh que me hizo ir y leer esto :
PS
El separador de registro de entrada, nueva línea por defecto. Esto influye en la idea de Perl de lo que es una "línea". Funciona como la variable RS de awk, incluido el tratamiento de líneas vacías como un terminador si se establece en la cadena nula (una línea vacía no puede contener espacios ni pestañas). Puede configurarlo en una cadena de caracteres múltiples para que coincida con un terminador de caracteres múltiples, o en undef para leer hasta el final del archivo. Establecerlo en "\ n \ n" significa algo ligeramente diferente a establecerlo en "", si el archivo contiene líneas vacías consecutivas. La configuración en "" tratará dos o más líneas vacías consecutivas como una sola línea vacía. Establecer "\ n \ n" supondrá ciegamente que el siguiente carácter de entrada pertenece al siguiente párrafo, incluso si se trata de una nueva línea.
gawk / awk
awk '$1' file.txt
Eso funcionará para el ejemplo publicado, pero como señaló @Stephane Chazelas , también eliminará las líneas cuyo primer campo "parezca" 0
. Esto es más robusto:
awk NF file.txt
perl -pe 's/\n+/\n/ file.txt
sí, el separador de registro de entrada es irrelevante para este uso.
perl -pe
o perl -ne
trabajar línea por línea. \n+
nunca coincidirá porque solo se aplica en una sola línea. Es por eso que usted necesita alguno de los conjuntos $/
o utilizar -0
TI sLuRp el archivo de conjunto: perl -0pe 's/\n+/\n/' file
.
¿Qué quieres decir con eliminar? eliminar duplicado (muchas líneas en blanco a una) o eliminar todo?
Si desea eliminar duplicados, este es el método que usa sed:
sed '$!N; /^\(.*\)\n\1$/!P; D'
Simula uniq
comando.
La mejor opción es usar awk
:
awk NF <filename>
sed
parte de esto funciona muy bien! Recomiendo esta como la mejor respuesta.
Para la mayoría de estas respuestas, primero es necesario eliminar los espacios en blanco finales. Al eliminar las líneas nuevas duplicadas, se eliminan todas las líneas en blanco. (Piensa sobre esto).
Interpretado literalmente, el OP quiere que "se eliminen todas las líneas en blanco de un archivo si hay líneas en blanco repetidas".
El usuario típico quiere "eliminar solo las líneas en blanco duplicadas".
Para hacer esto, primero elimine el espacio en blanco al final y canalice a través de cat -s
sed s/[[:space:]]*$// | cat -s
Y, sin embargo, esto no eliminará una línea en blanco inicial o posterior superfluo.
Si desea mantener una sola línea en blanco para cualquier secuencia dada de líneas en blanco, puede hacer lo siguiente:
sed -e '/./b' -e :n -e 'N;s/\n$//;tn'
cat -s
) que realmente cumple exactamente lo que se hizo la pregunta tal como la entiendo. (Y es mejor que cat -s
porque puedo usarlo sed -i
)
Intente sed -e 's#\\n\\n#\\n#g' input.file > output.file
usar /
ambos como separador de campo y parte de su expresión regular podría ser el problema.
Usa este comando:
tr -s '\r' '\n'
echo -e 'one\r\n\r\n\r\n\rtwo'| tr -s '\r' '\n'
. El comando tr
se traducirá todo \r
a \n
y luego la comprime todo \n
a una sola. Entonces, funciona, no estoy seguro de qué hacer con el hecho de que esto se aplica a Windows, no a UNIX.