GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo desenvolver texto de 80 caracteres

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')

Linux
  1. ¿Cómo ajustar el texto a un determinado tamaño de columna?

  2. ¿Cómo encontrar corchetes no coincidentes en un archivo de texto?

  3. Cómo copiar y pegar en Putty

  4. ¿Cómo canalizo una llamada de subproceso a un archivo de texto?

  5. Cómo editar un archivo de texto en mi terminal

Cómo instalar Sublime Text 3 en CentOS 7

Cómo instalar Sublime Text 4 en Ubuntu 20.04

Cómo instalar Sublime Text en Ubuntu 22.04 / Ubuntu 20.04

Cómo instalar Sublime Text 3 estable en Linux

Cómo instalar paquetes en Atom Text Editor

Cómo instalar Sublime Text 4 en AlmaLinux 8