¿Existe una herramienta de línea de comando para insertar saltos de línea en una cadena larga?


18

Dada una cadena larga que debe mostrarse con un ancho de texto limitado, ¿hay una herramienta de línea de comando en * nix que convierta la cadena de una sola línea en una cadena de varias líneas con cada línea que no sea más larga que un ancho de texto dado?

Por ejemplo, dada la siguiente cadena

$ 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."

Me gustaría formatear algo así:

$ 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.

Respuestas:


24

Puedes probar el foldcomando:

echo "$MYSTRING" | fold -w 30

2
+1, pero tal vez mejor escrito como echo $MYSTRING | fold -w 30, ya que la -30sintaxis no aparece en la página de manual de fold .
ire_and_curses

55
Para la posteridad, también existe fmt. La diferencia entre foldy fmtes que se foldajustará en el ancho fijo, incluso dividiendo palabras y puede comenzar líneas con espacios en blanco. Si bien se fmtajustará cerca o debajo del ancho, no dividirá las palabras, las líneas no comenzarán con espacios en blanco y se pueden unir líneas cortas.
bahamat

55
foldparece tener un comportamiento similar a fmtcuando -sse usa la opción.
Cory Klein

divertido, utilicé la opción -w pero lo dividió por char.
anfibio

6

Aquí hay un método que usa sed:

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

Pero, ¿qué significa?
Richard

1
@ Richard Reemplace 30 de cualquier carácter, excepto nueva línea ( .\{30\}), con la misma cadena ( &), seguido de una nueva línea.
Chris Down

6

El propósito completo de fmt(parte de los coreutils de GNU y otras versiones del IIRC se incluyeron con nixes que no son GNU *, por lo que es casi seguro que ya estén instalados) es reformatear los párrafos.

Sin embargo, hay una herramienta aún mejor llamada par(para reformatear párrafo). Puede hacer todo lo que fmtpuede hacer, pero con muchas más opciones para controlar el formato de salida exacto.

Una de las muchas cosas realmente buenas pares que es muy inteligente manejar las citas en correos electrónicos (incluso múltiples niveles de citas), muy útil ... Tengo mi .vimrc configurado para que presionar F5 envíe el párrafo actual a la par.

Si no está empaquetado para su distribución (es para Debian y derivados, probablemente también para otros), puede encontrar el par en http://www.nicemice.net/par/


Por "no GNU * nixes", ¿te refieres a los Unixes "reales" (no "Unix-like")? (De lo contrario, parece una herramienta genial).
Emanuel Berg

Me refiero a basura obsoleta patentada * nixes.
cas

Eso es lo que pensé, pero ¿por qué estás usando el asterisco? Pensé que era evitar tener que escribir "Unix-like" todo el tiempo (para Linux, etc.). (No te estoy molestando por un detalle, o bueno, lo estoy, pero realmente quiero saber, no te estoy molestando por el simple hecho de hacerlo).
Emanuel Berg

*nixes solo una forma de decir "unix genérico o sistemas similares a unix" - data de un momento en que la palabra Unix era una marca registrada de AT&T
cas

3

fold -s es la respuesta más corta y mejor a tu pregunta.

Sin embargo, a pesar de que esas herramientas de un solo propósito son buenas en algunos casos, en general, debe hacer que su editor haga esto.

En Emacs, puede modificar esto de la forma que desee. En cuanto a mí, lo uso visual-line-mode(aparece como un Wrapmodo menor en la línea de modo) porque en el caso general, no quiero saltos de línea en ningún otro lugar que no sea al final de los párrafos.

Pensé que diría la forma en que lo hago. No es "el" camino, pero es un camino; Como menciono las funciones y variables, su forma es juntarlas y automatizarlas para que funcionen para usted. (Esto es Emacs, pero para cualquier editor suficientemente avanzado, se podría escribir una publicación similar).

Dije que tengo las líneas visualmente ajustadas cuando escribo, y nunca las rompo manualmente. Como siempre, hay excepciones: por ejemplo, GNUS no enviará publicaciones a Usenet con líneas más allá de un cierto ancho (en caracteres). Entonces, yo uso M-q. En Emacs, M-qejecuta el comando fill-paragraph. La variable fill-columncontrola el ancho para el relleno. Como ejemplo, si escribo esto (en una sola línea)

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.

y luego uso Mq, obtengo

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.

Con justify-current-line(el doble de dos líneas), obtienes

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.

Pero descubrí que las personas rara vez usan fuentes monoespaciales para ver cosas, por lo que no tenía mucho sentido usarlo (aparte para mi propio placer visual). Si te gusta, puedes ajustar fill-paragraphpara llenar y justificar al mismo tiempo. También podría tener Emacs hacer esto para usted, siempre, a medida que escribe: auto-fill-mode. (Me pareció estresante, pero ese soy yo).

Esto puede parecer mucho trabajo, y lo es; pero una vez que haya terminado (con esta y otras 1000 cosas) realmente puede disfrutar trabajando con las herramientas comportándose exactamente como lo desea.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.