Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams DESCRIPTION Convert blanks in each FILE to tabs, writing to standard output. With no FILE, or when FILE is -, read standard input. Mandatory arguments to long options are mandatory for short options -a, --all convert all blanks, instead of just initial blanks --first-only convert only leading sequences of blanks (overrides -a) -t, --tabs=N have tabs N characters apart instead of 8 (enables -a) -t, --tabs=LIST use comma separated LIST of tab positions (enables -a) --help display this help and exit --version output version information and exit . . . STANDARDS The expand and unexpand utilities conform to IEEE Std 1003.1-2001 (``POSIX.1''). Woah, never knew expand/unexpand existed. I was trying to do the opposite and expand was perfect rather than having to mess around with tr or sed . Ibrahim Jan 9, 2013 at 5:43 So cool that these are standard. I love the UNIX philosophy . Would be nice if it could do in place though. Matthew Flaschen Nov 14, 2013 at 3:26 I don't think unexpand will work here.. it only convert the leading spaces and only with two or more spaces.. see here: lists.gnu.org/archive/html/bug-textutils/2001-01/msg00025.html olala Dec 17, 2013 at 4:26 Just a caution - unexpand will not convert a single space into a tab. If you need to blindly convert all runs of 0x20 characters into a single tab, you need a different tool. Steve S. Feb 4, 2015 at 16:47 In your sed example, best practices dictate that you use tr to replace single characters over sed for efficiency/speed reasons. Also, tr example is much easier this way: tr ' ' \\t < someFile > someFile Sam Bisbee Sep 14, 2009 at 22:12 Of course, tr has better performance than sed, but the main reason I have for loving Unix is that there're many ways to do something. If you plan to do this substitution many times you will search a solution with a good performance, but if you are going to do it only once, you will serach for a solution wich involves a command that make you feel confortable. Jonathan Sep 15, 2009 at 14:37 arg. I had to use trial and error to make the sed work. I have no idea why I had to escape the plus sign like this: ls -l | sed "s/ \+/ /g" Jess Apr 11, 2013 at 19:37 With awk -v OFS="\t" '$1=$1' file1 I noticed that if you have a line beginning with number 0 (e.g. 0 1 2 ), then the line will be ommitted from the result. Nikola Novak Jun 29, 2014 at 18:13 @Jess You found "correct default syntax" regex. By default sed treat single (unescaped) plus sign as simple character. The same is true for some other characters like '?', ... You can find more info here: gnu.org/software/sed/manual/html_node/… . Similar syntax details can be found here (note that this is man for grep, not sed): gnu.org/software/grep/manual/grep.html#Basic-vs-Extended . Victor Yarema Feb 22, 2016 at 19:29 Had a similar problem with replace consecutive spaces with a single tab. Perl worked worked with only the addition of a '+' to the regexp. Todd Mar 22, 2013 at 18:53 Though, of course, I wanted to do the opposite: convert tabs to two spaces: perl -p -i -e 's/\t/ /g' *.java TimP Jul 6, 2013 at 14:53 This was the only variant that worked for me; I used s/ {4}/ to convert 4-space indenting to tabs. CrazyPyro Sep 4, 2020 at 16:00

This will clean up the output of say, unzip -l , for further processing with grep, cut, etc.

e.g.,

unzip -l some-jars-and-textfiles.zip | tr [:blank:] \\t | cut -f 5 | grep jar

Example command for converting each .js file under the current dir to tabs (only leading spaces are converted):

find . -name "*.js" -exec bash -c 'unexpand -t 4 --first-only "$0" > /tmp/totabbuff && mv /tmp/totabbuff "$0"' {} \;

Download and run the following script to recursively convert soft tabs to hard tabs in plain text files.

Place and execute the script from inside the folder which contains the plain text files.

#!/bin/bash
find . -type f -and -not -path './.git/*' -exec grep -Iq . {} \; -and -print | while read -r file; do {
    echo "Converting... "$file"";
    data=$(unexpand --first-only -t 4 "$file");
    rm "$file";
    echo "$data" > "$file";
}; done;

You can also use astyle. I found it quite useful and it has several options too:

Tab and Bracket Options:
   If  no  indentation  option is set, the default option of 4 spaces will be used. Equivalent to -s4 --indent=spaces=4.  If no brackets option is set, the
   brackets will not be changed.
   --indent=spaces, --indent=spaces=#, -s, -s#
          Indent using # spaces per indent. Between 1 to 20.  Not specifying # will result in a default of 4 spaces per indent.
   --indent=tab, --indent=tab=#, -t, -t#
          Indent using tab characters, assuming that each tab is # spaces long.  Between 1 and 20. Not specifying # will result in a default assumption  of
          4 spaces per tab.`

If you are talking about replacing all consecutive spaces on a line with a tab then tr -s '[:blank:]' '\t'.

[root@sysresccd /run/archiso/img_dev]# sfdisk -l -q -o Device,Start /dev/sda
Device         Start
/dev/sda1       2048
/dev/sda2     411648
/dev/sda3    2508800
/dev/sda4   10639360
/dev/sda5   75307008
/dev/sda6   96278528
/dev/sda7  115809778
[root@sysresccd /run/archiso/img_dev]# sfdisk -l -q -o Device,Start /dev/sda | tr -s '[:blank:]' '\t'
Device  Start
/dev/sda1       2048
/dev/sda2       411648
/dev/sda3       2508800
/dev/sda4       10639360
/dev/sda5       75307008
/dev/sda6       96278528
/dev/sda7       115809778

If you are talking about replacing all whitespace (e.g. space, tab, newline, etc.) then tr -s '[:space:]'.

[root@sysresccd /run/archiso/img_dev]# sfdisk -l -q -o Device,Start /dev/sda | tr -s '[:space:]' '\t'
Device  Start   /dev/sda1       2048    /dev/sda2       411648  /dev/sda3       2508800 /dev/sda4       10639360        /dev/sda5       75307008        /dev/sda6     96278528        /dev/sda7       115809778  

If you are talking about fixing a tab-damaged file then use expand and unexpand as mentioned in other answers.

sed 's/[[:blank:]]\+/\t/g' original.out > fixed_file.out

This will for example reduce the amount of tabs.. or spaces into one single tab.

You can also do it for situations of multiple spaces/tabs into one space:

sed 's/[[:blank:]]\+/ /g' original.out > fixed_file.out
        

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.