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