Existe-t-il un outil en ligne de commande pour insérer des sauts de ligne dans une longue chaîne?


18

Étant donné une longue chaîne qui doit être affichée avec une largeur de texte limitée, existe-t-il un outil de ligne de commande dans * nix qui convertit la chaîne à une seule ligne en une chaîne à plusieurs lignes, chaque ligne ne dépassant pas une largeur de texte donnée?

Par exemple, étant donné la chaîne suivante

$ MYSTRING="Call me Ishmael. Some years ago - never mind how long precisely - having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world."

Je voudrais formater un peu comme ceci:

$ echo $MYSTRING | special-format-command --width=30
Call me Ishmael. Some years ag
o - never mind how long precis
ely - having little or no mone
y in my purse, and nothing par
ticular to interest me on shor
e, I thought I would sail abou
t a little and see the watery 
part of the world.

Réponses:


24

Vous pouvez essayer la foldcommande:

echo "$MYSTRING" | fold -w 30

2
+1, mais peut-être mieux écrit comme echo $MYSTRING | fold -w 30, puisque la -30syntaxe n'apparaît pas dans la page de manuel fold ?
ire_and_curses

5
Pour la postérité, il y en a aussi fmt. La différence entre foldet fmtest que la ligne foldsera bouclée à la largeur fixe, séparant même les mots et pouvant commencer les lignes par des blancs. Bien que fmtl'habillage soit proche ou inférieur à la largeur, il ne divise pas les mots, les lignes ne commencent pas par des blancs et des lignes courtes peuvent être jointes.
bahamat

5
foldsemble avoir un comportement similaire à fmtlorsque l' -soption est utilisée.
Cory Klein

drôle, j'ai utilisé l'option -w mais il l'a divisé par char.
amphibient

6

Voici une méthode utilisant sed:

sed 's/.\{30\}/&\
/g'

Mais qu'est-ce que ça veut dire?
Richard

1
@Richard Remplace 30 de tout caractère sauf newline ( .\{30\}), par la même chaîne ( &), suivi d'un retour à la ligne.
Chris Down

6

Le but entier de fmt(une partie de GNU coreutils et IIRC d'autres versions ont été incluses avec des nix non-GNU *, est donc presque certain d'être déjà installé) est de reformater les paragraphes.

Cependant, il existe un outil encore meilleur appelé par(pour le reformatage de paragraphe). Il peut tout fmtfaire, mais avec beaucoup plus d'options pour contrôler le format de sortie exact.

L'une des nombreuses choses vraiment intéressantes parest qu'il est très intelligent de gérer les citations dans les e-mails (même plusieurs niveaux de citations) - très utile ... J'ai mon .vimrc configuré de sorte que le fait d'appuyer sur F5 envoie le paragraphe actuel via le par.

S'il n'est pas empaqueté pour votre distribution (c'est pour debian et ses dérivés, probablement pour d'autres aussi), le par peut être trouvé à http://www.nicemice.net/par/


Par "non-GNU * nixes", voulez-vous dire les "vrais" Unix (pas "Unix-like")? (Sinon, un outil génial, semble-t-il.)
Emanuel Berg

je veux dire nixes indésirables * désormais obsolètes.
cas

C'est ce que je pensais, mais pourquoi utilisez-vous alors l'astérisque? Je pensais que c'était pour contourner le fait d'avoir à taper "Unix-like" tout le temps (pour Linux etc.). (Je ne vous embête pas sur un détail - ou bien, je le suis - mais je veux vraiment savoir, je ne vous embête pas pour le plaisir.)
Emanuel Berg

*nixest juste une façon de dire "systèmes génériques unix ou similaires à unix" - il date d'une époque où le mot Unix était une marque déposée d'AT & T
cas

3

fold -s est la réponse la plus courte et la meilleure à votre question.

Cependant, aussi bons que soient ces outils à usage unique dans certains cas, en général, vous devriez demander à votre éditeur de le faire.

Dans Emacs, vous pouvez modifier cela comme vous le souhaitez. Quant à moi, j'utilise visual-line-mode(apparaît comme un Wrapmode mineur dans la ligne de mode) parce que dans le cas général, je ne veux pas de sauts de ligne ailleurs qu'à la fin des paragraphes.

Je pensais que je dirais la façon dont je le fais. Ce n'est pas «la» voie, mais c'est une voie; comme je mentionne les fonctions et les variables, votre façon est de les assembler et de les automatiser pour les faire fonctionner pour vous. (Il s'agit d'Emacs, mais pour tout éditeur suffisamment avancé, un article similaire pourrait être écrit.)

J'ai dit que les lignes étaient visuellement enveloppées lorsque je saisissais et ne les cassais jamais manuellement. Comme toujours, il y a des exceptions: par exemple, GNUS n'enverra pas de messages à Usenet avec des lignes au-delà d'une certaine largeur (en caractères). Alors, j'utilise M-q. Dans Emacs, M-qexécute la commande fill-paragraph. La variable fill-columncontrôle la largeur de remplissage. Par exemple, si j'écris ceci (sur une seule ligne)

This is a lot of text being written right now. The purpose is to overflow the line so I have have to line break it with M-q.

puis utiliser Mq, je reçois

This is a lot of text being written right now. The purpose is to
overflow the line so I have have to line break it with M-q.

Avec justify-current-line(deux fois plus de deux lignes), vous obtenez

This  is a lot  of text  being written  right now.  The purpose  is to
overflow  the  line  so  I  have  have to  line  break  it  with  M-q.

Mais, j'ai constaté que les gens utilisent rarement les polices monospaces pour afficher les choses, donc cela n'avait pas beaucoup de sens de les utiliser (à part pour mon propre plaisir de visualisation). Si vous l'aimez, vous pouvez modifier fill-paragraphpour remplir et justifier en même temps. Vous pouvez également Emacs faire pour vous, toujours, comme vous tapez: auto-fill-mode. (J'ai trouvé cela stressant, mais c'est moi.)

Cela peut sembler beaucoup de travail, et c'est; mais une fois que vous avez terminé (avec ceci et 1000 autres choses), vous pouvez vraiment profiter de travailler avec les outils se comportant exactement comme vous les aimez.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.