GNU/Linux >> Znalost Linux >  >> Linux

Jak rozbalit 80znakový text

Odpověď pomocí fmt se zdá být zabalit text spíše než rozbalit to.

Obecně to může být obtížný problém. Například rozlišování mezi sousedními řádky textu, které jsou záměrně dokončeny dříve (např. odrážky) a sousedními řádky volně plynoucího textu, může vyžadovat určitý kontext. Rozlišování mezi slovy s pomlčkou rozdělenými mezi řádky a rozdělenými slovy je také obtížné.

Běžnou formou pro prózu jsou však sousední zalomené řádky textu tvořící odstavec oddělené jedním prázdným novým řádkem.

To lze rozbalit pomocí následující, spíše zapojené, jedné vložky:

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

Alternativně můžete dát přednost malému python skriptu, zvláště pokud budete řešit některé speciální případy:

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

Pokud zjistíte, že přidáváte speciální velká a malá písmena, rádi byste našli původ svého textu zalamovaného mezi řádky a získali jej ve formě bez zalamování.


Zvláštní případy, jak řekl Att Righ…

Tuto otázku jsem našel, protože jsem chtěl "rozbalit" výstup z fortune program, který nepříjemně není ani standardizován – některé soubory cookie štěstí jsou zabaleny do 78 znaků, jiné do 77, 76 nebo dokonce 75.
Můj skript se snaží určit, zda byl nový řádek vložen záměrně nebo kvůli limitu délky tím, že určí, zda by řádek porušil limit délky, pokud by nebyl přerušen v této přesné délce (tj. zda by byl příliš dlouhý, kdyby obsahovalo také první slovo z dalšího řádku). Užitečným vedlejším efektem je, že pokud další řádek začíná mezerami, první slovo (oddělené mezerami) je prázdný řetězec, takže odsazené odstavce se nikdy neslučují na řádek nad nimi.

#!/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. Jak zalomit text při určité velikosti sloupce?

  2. Jak zkopírovat a vložit v Putty

  3. Jak převedu volání podprocesu do textového souboru?

  1. Jak nainstalovat Vim (vi) na Windows 10

  2. Jak odstranit znak \r pomocí sed

  3. Jak upravit textový soubor v mém terminálu

  1. Jak najít nesrovnatelné závorky v textovém souboru?

  2. Jak připojím text k souboru?

  3. Jak kopírovat text z méně