≡ Menu

Bash Shell: Convert Tabs To Spaces In a File

How do convert tabs to spaces in a file using a bash shell?

You can use various tools. The expand command converts all tabs to spaces. It preserves backspace characters in the output; they decrement the column count for
tab calculations.

expand input.file > output.file
expand data.txt > output.txt
expand -t 2 data.txt > output.txt

The -t option can be used to set comma separated list of explicit tab positions. You can use the unexpand command convert spaces to tabs. See man page for more info:
man expand
man unexpand

{ 9 comments… add one }

  • Tapas Mallick March 6, 2010, 3:03 pm

    My imput.file looks like:
    $ cat input.file
    tux Linux
    tux Linux
    tux Linux
    tux Linux
    But executing expand on the file showing the same format(in STDOUT) as input.file…
    $ expand input.file
    tux Linux
    tux Linux
    tux Linux
    tux Linux
    Though I am getting the expected result with “tr” command.
    I am using CentOS 5.3(x86_64); Any comment ?

    • Tom De Maesschalck July 29, 2015, 8:20 am

      That’s because expand expects 2 tabs (=8 charachter spaces) as default tab.
      So it doesn’t a tab in your file.
      The command expand -t1 wil work with your file, as t1 means 4 spaces

  • stealth March 9, 2010, 1:33 pm

    You can also use perl:
    perl -pi -e ‘s/\t/ /’ file.name

  • Gen2ly March 10, 2010, 5:35 am


    for vim.

  • Tapas Mallick March 17, 2010, 8:26 am

    s are truncated in my posts itself :)

  • Towo March 14, 2013, 3:17 pm

    expand fails miserably on multibyte characters (i.e. on non-ASCII characters in UTF-8 encoding)
    still as of coreutils 8.21 (2013)

  • Dixon April 2, 2014, 5:37 am

    Its working for me
    Tab space conver into space
    expand -t 2 file | mailx -s “xxxx” email@add.com

  • Nick February 23, 2015, 9:14 pm

    expand doesn’t seem to do the right thing.
    Converting tabs to spaces in a piece of content is more than merely translating each tab character to a sequence of space characters. It needs to preserve the alignment of the text. So in this example text (no quotes):
    and with a tab spacing of 3 chars, the result should be (each period corresponds to a white space):
    This way the de-tabbed content would overlay the original content exactly (assuming the same tab setting).

  • Nick February 23, 2015, 10:23 pm

    Typo in my example, and not a great example. Let’s try this one instead:
    and with a tab spacing of 4 chars, the result should be (each period corresponds to a white space):

    Note how each tab char was not replaced with 4 spaces.

Leave a Comment

   Tagged with: , , , , , , , , , , , , , , , ,