fold and fmt

These two commands are useful to split and join lines to meet a specific line length requirement. fmt is smarter and usually the tool you want, but fold can be handy for some cases.

fold

By default, fold will wrap lines that are greater than 80 bytes long, which can be customized using the -w option. The newline character isn't part of this line length calculation. You might wonder if there are tasks where wrapping without context could be useful. One use case I can think of is the FASTA format.

$ cat greeting.txt
Hi there
Have a nice day

# splits second line since it is greater than 10 bytes
$ fold -w10 greeting.txt
Hi there
Have a nic
e day

The -s option looks for the presence of spaces to determine the line splitting. This check is performed within the limits of the wrap length.

$ fold -s -w10 greeting.txt
Hi there
Have a 
nice day

However, the -s option can still split words if there's no blank space before the specified width. Use fmt if you don't want this behavior.

$ echo 'hi there' | fold -s -w4
hi 
ther
e

The -b option will cause fold to treat tab, backspace, and carriage return characters as if they were a single byte character.

# tab can occupy up to 8 columns
$ printf 'a\tb\tc\t1\t2\t3\n' | fold -w6
a
        
b
        
c
        
1
        
2
        
3

# here, tab will be treated as if it occupies only 1 column
$ printf 'a\tb\tc\t1\t2\t3\n' | fold -b -w6
a       b       c       
1       2       3

fmt

The fmt command makes a smarter decision based on sentences, paragraphs and other details. Here's an example that splits a single line (taken from the documentation of fmt command) into several lines. The default formatting is 93% of 75 columns. The -w option controls the width parameter and the -g option controls the percentage of columns.

$ fmt info_fmt.txt
fmt prefers breaking lines at the end of a sentence, and tries to
avoid line breaks after the first word of a sentence or before the last
word of a sentence. A sentence break is defined as either the end of a
paragraph or a word ending in any of '.?!', followed by two spaces or
end of line, ignoring any intervening parentheses or quotes. Like TeX,
fmt reads entire "paragraphs" before choosing line breaks; the algorithm
is a variant of that given by Donald E. Knuth and Michael F. Plass in
"Breaking Paragraphs Into Lines", Software—Practice & Experience 11,
11 (November 1981), 1119–1184.

Unlike fold, words are not split even if they exceed the maximum line width. Another difference is that fmt will add a final newline character if it isn't present in the input.

$ printf 'hi there' | fmt -w4
hi
there

The fmt command also allows you to join lines together that are shorter than the specified width. As mentioned before, paragraphs are taken into consideration, so empty lines will prevent merging. The -s option will disable line merging.

$ cat sample.txt
 1) Hello World
 2) 
 3) Hi there
 4) How are you
 5) 
 6) Just do-it
 7) Believe it
 8) 
 9) banana
10) papaya
11) mango
12) 
13) Much ado about nothing
14) He he he
15) Adios amigo

# 'cut' here helps to ignore first 4 characters of sample.txt
$ cut -c5- sample.txt | fmt -w30
Hello World

Hi there How are you

Just do-it Believe it

banana papaya mango

Much ado about nothing He he
he Adios amigo

The -u option will change multiple spaces to a single space. Excess spacing between sentences will be changed to two spaces.

$ printf 'Hi    there.    Have a nice   day\n' | fmt -u
Hi there.  Have a nice day

There are options that control indentation, option to format only lines with a specific prefix and so on. See fmt documentation for more details.