Tengo algunos archivos de texto que utilizo para tomar notas, solo texto simple, generalmente solo uso cat >> file
. Ocasionalmente uso una o dos líneas en blanco (solo regreso - el carácter de nueva línea) para especificar un nuevo asunto / línea de pensamiento. Al final de cada sesión, antes de cerrar el archivo con Ctrl+ D, típicamente agrego lotes (5-10) líneas en blanco (tecla de retorno) solo para separar las sesiones.
Obviamente, esto no es muy inteligente, pero funciona para mí con este propósito. Yo no obstante terminar con las porciones y las porciones de líneas en blanco innecesarios, por lo que estoy buscando una manera de quitar (la mayoría de) las líneas adicionales. ¿Hay un comando de Linux (cortar, pegar, grep, ...?) Que pueda usarse directamente con algunas opciones? Alternativamente, ¿alguien tiene una idea para un script sed, awk o perl (bueno en cualquier lenguaje de script realmente, aunque preferiría sed o awk) que haría lo que quisiera? Escribir algo en C ++ (que en realidad podría hacer yo mismo), parece una exageración.
Caso # 1: Lo que necesito es un script / comando que elimine más de dos (3 o más) líneas en blanco consecutivas y las reemplace con solo dos líneas en blanco. Aunque sería bueno si también se pudiera ajustar para eliminar más de una línea (2 o más) y / o reemplazar varias líneas en blanco con solo una línea en blanco.
Caso # 2: También podría usar un script / comando que eliminaría una sola línea en blanco entre dos líneas de texto, pero dejaría varias líneas en blanco tal como están (aunque eliminar una de las líneas en blanco también sería aceptable).
vim
y era reemplazar las líneas en blanco con una línea en blanco).Respuestas:
Caso 1:
Caso 2:
fuente
Puede usar
uniq
para contraer varias instancias de líneas en blanco en una línea en blanco, pero también colapsará las líneas que contienen texto si son iguales y están una debajo de la otra.fuente
Caso 1:
Caso 2:
fuente
Puede abordar el Caso # 1 de esta manera con GNU sed:
Es decir, recolecte líneas vacías en el espacio del patrón, y si hay más de tres o más líneas, reduzca a dos líneas.
Para unir líneas separadas, como en el Caso # 2, puede hacerlo así:
O en forma comentada:
fuente
Esta solución también se ocupa de las últimas líneas en blanco en el archivo:
fuente
Siguiendo la sugerencia de Anthon de usar "uniq" ...
Elimine las líneas en blanco iniciales, finales y duplicadas.
En una larga línea:
O simplemente use "cat -s".
Cambié de paréntesis a llaves para permanecer en el contexto actual de shell, que supongo es más eficiente. Tenga en cuenta que las llaves requieren punto y coma después del último comando y necesitan un espacio para la separación.
En una sola linea.
fuente
Las soluciones publicadas me parecieron un poco crípticas. Aquí está la solución en Python 3.6:
Puede llamar a las funciones desde un intérprete o ejecutarlo desde el shell como:
fuente