GNU/Linux >> Linux Esercitazione >  >> Linux

Come scartare un testo di 80 caratteri

La risposta usando fmt sembra essere avvolgere text anziché unwrap esso.

In generale, questo può essere un problema difficile. Ad esempio, la distinzione tra righe di testo adiacenti che sono state deliberatamente terminate in anticipo (ad es. elenchi puntati) e righe adiacenti di testo scorrevole può richiedere un certo contesto. Anche distinguere tra parole con trattino divise su righe e parole divise è difficile.

Una forma comune per la prosa, tuttavia, è rappresentata da righe di testo a capo adiacenti che formano un paragrafo separato da una singola riga vuota.

Questo può essere scartato usando il seguente, piuttosto complicato,sed one liner:

sed -n '/.+/ H; /^$/ { x; s/\n/ /g; s/$/\n/ ; p}'

In alternativa potresti preferire un minuscolo script Python, in particolare se hai intenzione di gestire alcuni casi speciali:

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

Se ti ritrovi ad aggiungere maiuscole e minuscole speciali, allora ti piace trovare l'origine del tuo testo con ritorno a capo e ottenerlo in una forma senza ritorno a capo.


Casi speciali, come ha detto Att Righ...

Ho trovato questa domanda perché volevo "scartare" l'output dal fortune programma, che fastidiosamente non è nemmeno standardizzato:alcuni biscotti della fortuna sono racchiusi in 78 caratteri, altri in 77, 76 o addirittura 75.
Il mio script tenta di determinare se una nuova riga è stata inserita di proposito oa causa del limite di lunghezza determinando se la riga violerebbe il limite di lunghezza se non fosse stata interrotta a questa lunghezza esatta (ovvero se sarebbe troppo lunga se fosse includeva anche la prima parola della riga successiva). Come utile effetto collaterale, se la riga successiva inizia con spazi bianchi, la prima parola (separata da spazi bianchi) è la stringa vuota, quindi i paragrafi rientrati non vengono mai uniti alla riga sopra di essi.

#!/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. Come avvolgere il testo in una determinata dimensione della colonna?

  2. Come trovare parentesi non corrispondenti in un file di testo?

  3. Come posso convogliare una chiamata di sottoprocesso a un file di testo?

  4. Come si aggiunge del testo a un file?

  5. Come rimuovere il carattere \r con sed

Come installare Sublime Text 3 su CentOS 7

Come installare Sublime Text 4 su Ubuntu 20.04

Come installare Sublime Text su Ubuntu 22.04 / Ubuntu 20.04

Come installare Sublime Text 3 Stable in Linux

Come installare i pacchetti in Atom Text Editor

Come installare Sublime Text 4 su AlmaLinux 8