Robert Elder Software Inc.
  • Home
  • Store
  • Blog
  • Contact
  • Home
  • Store
  • Blog
  • Contact
  • #linux
  • |
  • #commandline
  • |
  • #softwareengineering
  • |
  • #embeddedsystems
  • |
  • #compilers
  • ...
  • View All >>

Intro To 'expand' Command In Linux

2023-06-09 - By Robert Elder

     I use the 'expand' command to replace tabs with spaces:

echo -n $'\t' | expand | xxd
00000000: 2020 2020 2020 2020

Expand Tabs Into Spaces

     Here, I have an 'echo' statement that prints out a single tab character between the letters 'a' and 'b':

echo -en "a\tb" 
echo -en "a\tb" | xxd
00000000: 6109 62                                  a.b

     If I pipe this 'echo' statement into the 'expand' command, the single tab character will be replaced by eight space characters:

echo -en "a\tb" | expand | xxd
00000000: 6120 2020 2020 2020 62                   a       b

Default Use Case & Custom Tab Width

     Here, I have a file called 'numbers.txt' that contains several columns of random numbers:

	29303	32454	7898	4022
	11773	16085	19539	32199
	16335	23913	17824	14969
	25557	15589	2375	8899

     With the 'expand' command, the default number of spaces to replace each tab with is 8:

cat numbers.txt | expand
        29303   32454   7898    4022
        11773   16085   19539   32199
        16335   23913   17824   14969
        25557   15589   2375    8899

     I can specify a different number like 12 with the '-t' flag:

cat numbers.txt | expand -t 12
            29303       32454       7898        4022
            11773       16085       19539       32199
            16335       23913       17824       14969
            25557       15589       2375        8899

Initial Tabs

     The 'expand' command can treat 'initial' tabs differently when they start at the beginning of a line before any non-blank characters.  Let's add one extra line to the file above:

echo -e "1234\t5678" >> numbers.txt

     so now it looks like this:

	29303	32454	7898	4022
	11773	16085	19539	32199
	16335	23913	17824	14969
	25557	15589	2375	8899
1234	5678

     Now, I can include the '-i' flag to cause only the initial tabs to be replaced:

cat numbers.txt | expand -i -t 12
            29303	32454	7898	4022
            11773	16085	19539	32199
            16335	23913	17824	14969
            25557	15589	2375	8899
1234	5678

     And here is the hexadecimal output from above:

cat numbers.txt | expand -i -t 12 | xxd
00000000: 2020 2020 2020 2020 2020 2020 3239 3330              2930
00000010: 3309 3332 3435 3409 3738 3938 0934 3032  3.32454.7898.402
00000020: 320a 2020 2020 2020 2020 2020 2020 3131  2.            11
00000030: 3737 3309 3136 3038 3509 3139 3533 3909  773.16085.19539.
00000040: 3332 3139 390a 2020 2020 2020 2020 2020  32199.
00000050: 2020 3136 3333 3509 3233 3931 3309 3137    16335.23913.17
00000060: 3832 3409 3134 3936 390a 2020 2020 2020  824.14969.
00000070: 2020 2020 2020 3235 3535 3709 3135 3538        25557.1558
00000080: 3909 3233 3735 0938 3839 390a 3132 3334  9.2375.8899.1234
00000090: 0935 3637 380a                           .5678.

A Practical Example

     Here, I have a tab separated document called 'living-expenses.txt':

	Category	Jan	Feb	Mar

	Food	$102.78	$97.34	$112.42
	Rent	$380.00	$380.00	$380.00
	Linux Weekly News Subscription	$9.00	$9.00	$9.00
	Artistic Anime Figurines	$1,749.38	$2,109.87	$3,829.48

     This document is hard to read because some of the entries are much longer than eight characters.

     I can provide a list of column offsets to the '-t' flag so the tab characters will be expanded with as many spaces as necessary to reach the specified offset for each column.

cat living-expenses.txt | expand -t 1,33,43,53,63
 Category                        Jan       Feb       Mar

 Food                            $102.78   $97.34    $112.42
 Rent                            $380.00   $380.00   $380.00
 Linux Weekly News Subscription  $9.00     $9.00     $9.00
 Artistic Anime Figurines        $1,749.38 $2,109.87 $3,829.48

     And that's why the 'expand' command is my favourite Linux command.

Intro To 'stty' Command In Linux
Intro To 'stty' Command In Linux
Published 2023-10-04
Terminal Block Mining Simulation Game
$1.00 CAD
Terminal Block Mining Simulation Game
Intro To 'nproc' Command In Linux
Intro To 'nproc' Command In Linux
Published 2023-07-15
Intro To 'comm' Command In Linux
Intro To 'comm' Command In Linux
Published 2023-09-06
How To Force The 'true' Command To Return 'false'
How To Force The 'true' Command To Return 'false'
Published 2023-07-09
A Surprisingly Common Mistake Involving Wildcards & The Find Command
A Surprisingly Common Mistake Involving Wildcards & The Find Command
Published 2020-01-21
A Guide to Recording 660FPS Video On A $6 Raspberry Pi Camera
A Guide to Recording 660FPS Video On A $6 Raspberry Pi Camera
Published 2019-08-01
Intro To 'chroot' Command In Linux
Intro To 'chroot' Command In Linux
Published 2023-06-23
Join My Mailing List
Privacy Policy
Why Bother Subscribing?
  • Free Software/Engineering Content. I publish all of my educational content publicly for free so everybody can make use of it.  Why bother signing up for a paid 'course', when you can just sign up for this email list?
  • Read about cool new products that I'm building. How do I make money? Glad you asked!  You'll get some emails with examples of things that I sell.  You might even get some business ideas of your own :)
  • People actually like this email list. I know that sounds crazy, because who actually subscribes to email lists these days, right?  Well, some do, and if you end up not liking it, I give you permission to unsubscribe and mark it as spam.
© 2025 Robert Elder Software Inc.
SocialSocialSocialSocialSocialSocialSocial
Privacy Policy      Store Policies      Terms of Use