≡ 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

Tweet itFacebook itGoogle+ itPDF itFound an error/typo on this page?

{ 8 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 ?

  • 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

    :retab

    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):
    “Foo\tBar\tBazinga!”
    and with a tab spacing of 3 chars, the result should be (each period corresponds to a white space):
    “Foo…Bar..Bazinga!”
    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:
    “Foo\tBars\tBazinga!”
    and with a tab spacing of 4 chars, the result should be (each period corresponds to a white space):
    “Foo.Bars….Bazinga!”

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

Leave a Comment