GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So entpacken Sie 80-Zeichen-Text

Die Antwort mit fmt scheint zu verpacken zu sein Text statt unwrap es.

Im Allgemeinen kann dies ein schwieriges Problem sein. Beispielsweise kann die Unterscheidung zwischen benachbarten Textzeilen, die absichtlich vorzeitig beendet werden (z. B. Aufzählungszeichen) und benachbarten Zeilen mit frei fließendem Text einen gewissen Kontext erfordern. Die Unterscheidung zwischen Wörtern mit Bindestrich, die über Zeilen verteilt sind, und getrennten Wörtern ist ebenfalls schwierig.

Eine übliche Form für Prosa sind jedoch benachbarte umbrochene Textzeilen, die einen Absatz bilden, der durch einen einzelnen leeren Zeilenumbruch getrennt ist.

Dies kann mit dem folgenden, ziemlich umständlichen Liner ausgepackt werden:

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

Alternativ bevorzugen Sie vielleicht ein winziges Python-Skript, insbesondere wenn Sie mit einigen Sonderfällen umgehen:

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

Wenn Sie feststellen, dass Sie spezielle Groß- und Kleinschreibung hinzufügen, möchten Sie den Ursprung Ihres Zeilenumbruchtextes finden und ihn in einer nicht umbrochenen Form erhalten.


Sonderfälle, wie Att Righ sagte …

Ich habe diese Frage gefunden, weil ich die Ausgabe von fortune "auspacken" wollte Programm, das ärgerlicherweise nicht einmal standardisiert ist – einige Glückskekse sind mit 78 Zeichen umschlossen, andere mit 77, 76 oder sogar 75.
Mein Skript versucht festzustellen, ob absichtlich oder aufgrund der Längenbegrenzung ein Zeilenumbruch eingefügt wurde, indem festgestellt wird, ob die Zeile gegen die Längenbegrenzung verstoßen würde, wenn sie nicht genau in dieser Länge umbrochen worden wäre (d.h. ob sie zu lang wäre, wenn sie enthielt auch das erste Wort aus der nächsten Zeile). Als nützlicher Nebeneffekt gilt:Wenn die nächste Zeile mit Leerzeichen beginnt, ist das erste Wort (durch Leerzeichen getrennt) der leere String, sodass eingerückte Absätze niemals mit der darüber liegenden Zeile zusammengeführt werden.

#!/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. Wie wird Text bei einer bestimmten Spaltengröße umgebrochen?

  2. Wie finde ich nicht übereinstimmende Klammern in einer Textdatei?

  3. Wie man in Putty kopiert und einfügt

  4. Wie leite ich einen Unterprozessaufruf an eine Textdatei weiter?

  5. So entfernen Sie \r-Zeichen mit sed

So installieren Sie Sublime Text 3 unter CentOS 7

So installieren Sie Sublime Text 4 unter Ubuntu 20.04

So installieren Sie Sublime Text unter Ubuntu 22.04 / Ubuntu 20.04

So installieren Sie Sublime Text 3 Stable unter Linux

So installieren Sie Pakete im Atom-Texteditor

So installieren Sie Sublime Text 4 auf AlmaLinux 8