La respuesta usando fmt
parece ser para envolver texto en lugar de desenvolver eso.
En general, esto puede ser un problema difícil. Por ejemplo, distinguir entre líneas de texto adyacentes que se terminan deliberadamente antes de tiempo (por ejemplo, viñetas) y líneas adyacentes de texto fluido puede requerir algo de contexto. Distinguir entre palabras con guión divididas en líneas y palabras divididas también es difícil.
Sin embargo, una forma común para la prosa son las líneas de texto adyacentes que forman un párrafo separado por una única línea nueva vacía.
Esto se puede desenvolver usando el siguiente forro, bastante complicado, sed:
sed -n '/.+/ H; /^$/ { x; s/\n/ /g; s/$/\n/ ; p}'
Alternativamente, puede preferir una pequeña secuencia de comandos de python, especialmente si va a manejar algunos casos especiales:
import sys
paragraph = []
for line in sys.stdin:
line = line.strip()
if line:
paragraph.append(line)
else:
print ' '.join(paragraph).replace(' ', ' ')
paragraph = []
if paragraph:
print ' '.join(paragraph).replace(' ', ' ')
Si se encuentra agregando mayúsculas y minúsculas especiales, le gustará encontrar el origen de su texto ajustado en línea y obtenerlo en una forma no ajustada.
Casos especiales, como dijo Att Righ...
Encontré esta pregunta porque quería "desenvolver" la salida del fortune
programa, que molestamente ni siquiera está estandarizado:algunas galletas de la fortuna están envueltas en 78 caracteres, otras en 77, 76 o incluso 75.
Mi secuencia de comandos intenta determinar si se ha insertado una nueva línea a propósito o debido al límite de longitud al determinar si la línea violaría el límite de longitud si no se hubiera roto en esta longitud exacta (es decir, si sería demasiado larga si también incluyó la primera palabra de la siguiente línea). Como efecto secundario útil, si la siguiente línea comienza con un espacio en blanco, la primera palabra (separada por un espacio en blanco) es la cadena vacía, por lo que los párrafos con sangría nunca se fusionan con la línea que está encima de ellos.
#!/usr/bin/python3
import sys
import fileinput
lines = list(fileinput.input())
lines = [l.strip('\r\n') for l in lines]
for i, l in enumerate(lines):
# We need to account for 8-char-wide tabulators when calculating our line
# length, but still want to print the original \t characters verbatim
sanitized_line = l.replace('\t', ' '*8)
# Is there a next line?
if i+1 < len(lines):
sanitized_next_line = lines[i+1].replace('\t', ' '*8)
else:
sanitized_next_line = ''
next_line_first_word = sanitized_next_line.split(' ', 1)[0]
if next_line_first_word != '':
extended_line = sanitized_line + ' ' + next_line_first_word
else:
extended_line = sanitized_line
if len(sanitized_line) <= 78 and len(extended_line) > 74:
# This line was wrapped due to 78-char limit => unwrap it!
sys.stdout.write(l + ' ')
else:
sys.stdout.write(l + '\n')