GNU/Linux >> Tutoriels Linux >  >> Linux

Comment dérouler un texte de 80 caractères

La réponse en utilisant fmt semble être envelopper texte plutôt que dérouler il.

En général, cela peut être un problème difficile. Par exemple, la distinction entre des lignes de texte adjacentes qui sont délibérément terminées plus tôt (par exemple, des puces) et des lignes adjacentes de texte fluide peut nécessiter un certain contexte. Il est également difficile de faire la distinction entre les mots avec un trait d'union répartis sur plusieurs lignes et les mots divisés.

Une forme courante pour la prose, cependant, est constituée de lignes adjacentes enveloppées de texte formant un paragraphe séparés par une seule nouvelle ligne vide.

Cela peut être déballé en utilisant la doublure suivante, plutôt compliquée :

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

Sinon, vous préférerez peut-être un petit script python, en particulier si vous devez gérer certains cas particuliers :

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 vous vous retrouvez à ajouter une casse spéciale, vous aimez trouver l'origine de votre texte avec retour à la ligne et l'obtenir sous une forme non retour à la ligne.


Des cas particuliers, comme disait Att Righ…

J'ai trouvé cette question parce que je voulais "déballer" la sortie du fortune programme, qui, malheureusement, n'est même pas standardisé - certains biscuits de fortune sont emballés à 78 caractères, d'autres à 77, 76 ou même 75.
Mon script essaie de déterminer si une nouvelle ligne a été insérée exprès ou à cause de la limite de longueur en déterminant si la ligne violerait la limite de longueur si elle n'avait pas été coupée à cette longueur exacte (c'est-à-dire si elle serait trop longue si elle également inclus le premier mot de la ligne suivante). Comme effet secondaire utile, si la ligne suivante commence par un espace, le premier mot (séparé par un espace) est la chaîne vide, de sorte que les paragraphes en retrait ne sont jamais fusionnés sur la ligne au-dessus d'eux.

#!/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. Comment ajouter du texte à la fin du fichier sous Linux

  2. Comment installer Vim (vi) sur Windows 10

  3. Comment envelopper du texte à une certaine taille de colonne ?

  4. Comment trouver des parenthèses sans correspondance dans un fichier texte ?

  5. Comment copier et coller dans Putty

Comment installer Sublime Text 3 sur CentOS 7

Comment installer Sublime Text 4 sur Ubuntu 20.04

Comment installer Sublime Text sur Ubuntu 22.04 / Ubuntu 20.04

Comment installer Sublime Text 3 Stable sous Linux

Comment installer des packages dans l'éditeur de texte Atom

Comment installer Sublime Text 4 sur AlmaLinux 8