Esiste uno strumento da riga di comando per inserire interruzioni di riga in una stringa lunga?


18

Data una stringa lunga che deve essere visualizzata con una larghezza del testo limitata, esiste uno strumento da riga di comando in * nix che converte la stringa a riga singola in una stringa a più righe con ciascuna riga non più lunga di una determinata larghezza del testo?

Ad esempio, data la seguente stringa

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

Vorrei formattare in qualche modo in questo modo:

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

Risposte:


24

Potresti provare il foldcomando:

echo "$MYSTRING" | fold -w 30

2
+1, ma forse meglio scritto come echo $MYSTRING | fold -w 30, poiché la -30sintassi non appare nella manpage fold ?
ire_and_curses il

5
Per i posteri c'è anche fmt. La differenza tra folde fmtè che foldavvolgerà alla larghezza fissa, anche dividendo le parole e potrebbe iniziare le linee con spazi vuoti. Mentre fmtsi avvolgerà vicino o sotto la larghezza, non dividerà le parole, le linee non inizieranno con spazi vuoti e le linee brevi possono essere unite.
Bahamat,

5
foldsembra avere un comportamento simile a fmtquando -sviene utilizzata l' opzione.
Cory Klein,

divertente, ho usato l'opzione -w ma l'ho divisa per char.
anfibio,

6

Ecco un metodo che utilizza sed:

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

Ma cosa significa?
Richard,

1
@Richard Sostituisci 30 di qualsiasi carattere tranne newline ( .\{30\}), con la stessa stringa ( &), seguito da una nuova riga.
Chris Down,

6

Lo scopo di fmt(parte dei coreutils GNU e altre versioni di IIRC sono stati inclusi con nix non GNU *, quindi è quasi certo che siano già installati) è riformattare i paragrafi.

Tuttavia, esiste uno strumento ancora migliore chiamato par(per il riformattatore di paragrafi). Può fare tutto ciò che fmtpuò fare, ma con molte più opzioni per controllare il formato di output esatto.

Una delle tante cose davvero interessanti parè che è molto intelligente gestire le citazioni nelle e-mail (anche più livelli di quotazioni) - molto utile ... Ho impostato il mio .vimrc in modo che colpire F5 invii il paragrafo corrente attraverso il par.

Se non è impacchettato per la tua distribuzione (è per debian e derivati, probabilmente anche per altri), puoi trovare il par su http://www.nicemice.net/par/


Con "nix non GNU *", intendi gli Unix "reali" (non "simili a Unix")? (Altrimenti strumento interessante, a quanto pare.)
Emanuel Berg

intendo junk * nixes ormai obsoleti.
Cas

Questo è quello che ho pensato, ma perché stai usando l'asterisco? Ho pensato che fosse per evitare di digitare "Unix-like" per tutto il tempo (per Linux ecc.). (Non ti sto infastidendo per un dettaglio - o bene, lo sono - ma voglio davvero saperlo, non ti sto infastidendo per il gusto di farlo.)
Emanuel Berg

*nixè solo un modo di dire "sistemi unix o unix-like generici" - risale al tempo in cui la parola Unix era un marchio proprietario di AT&T
Cas

3

fold -s è la risposta più breve e migliore alla tua domanda.

Tuttavia, per quanto buoni siano quegli strumenti monouso in alcuni casi, in generale, dovresti farlo fare al tuo editor.

In Emacs, potresti modificarlo comunque. Per quanto mi riguarda, io uso visual-line-mode(si presenta come una Wrapmodalità minore nella riga della modalità) perché nel caso generale, non voglio interruzioni di linea in nessun altro posto che alla fine dei paragrafi.

Ho pensato di dire come lo faccio. Non è "il" modo, ma è un modo; mentre menziono le funzioni e le variabili, il tuo modo è metterle insieme e automatizzarle per farle funzionare per te. (Questo è Emacs, ma per qualsiasi editor sufficientemente avanzato, potrebbe essere scritto un post simile.)

Ho detto di avere le linee visivamente avvolte durante la digitazione e di non romperle mai manualmente. Come sempre, ci sono eccezioni: ad esempio, GNUS non invierà post su Usenet con linee oltre una certa larghezza (in caratteri). Quindi, allora uso M-q. In Emacs, M-qesegue il comando fill-paragraph. La variabile fill-columncontrolla la larghezza per il riempimento. Ad esempio, se scrivo questo (su una sola riga)

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.

e poi uso Mq, ho capito

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(il doppio di due righe), ottieni

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.

Ma ho scoperto che le persone usano raramente i caratteri monospace per visualizzare le cose, quindi non ha molto senso usarlo (a parte il mio piacere di visione). Se ti piace, si potrebbe modificare fill-paragraphper riempire e giustificare allo stesso tempo. Si potrebbe anche avere Emacs fare questo per voi, sempre, durante la digitazione: auto-fill-mode. (L'ho trovato stressante, ma sono io.)

Questo può sembrare un sacco di lavoro, ed è; ma una volta terminato (con questa e altre 1000 cose) puoi davvero divertirti a lavorare con gli strumenti comportandoti esattamente come preferisci.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.