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