delladea: (Default)
Geeky Muse ([personal profile] delladea) wrote in [site community profile] dw_dev_training2012-02-03 01:52 pm
Entry tags:

Strip tab characters from multiple text files and replace them with spaces (or something else)

I switch between Gedit, Notepad++, and vim fairly often depending on what I'm doing and whose computer I'm on. Sometimes I end up with tab characters where I really wanted four spaces, mainly when I'm using vim and I haven't figured out how to get vim to not do this. Gedit and Notepad++ have settings to use spaces instead of tabs, so there's no issue there.

Either I don't notice the tab characters until after I've put lots of them in the file I'm editing, or I'm editing a file from someone else whose editor uses tab characters for indentation. I know its not a big deal to some people, but tab indentation mixed with space indentation is a huge pet peeve of mine.

Thus, a perl script was born:


View Gist (strip-tabs.pl)

Feel free to gank away if you find it useful!
mark: A photo of Mark kneeling on top of the Taal Volcano in the Philippines. It was a long hike. (Default)

[staff profile] mark 2012-02-03 08:34 pm (UTC)(link)
Cool, thanks for sharing!

Another way of doing this is using sed, like this:

sed -ie 's/\t/ /g' yourfile.pl

That will replace all tabs with four spaces in yourfile.pl. You can do it in all files of a certain type with something like this:

find -name \*.pl -exec sed -ie 's/\t/ /g' {} \;

That will find all Perl files (starting in the current directory and going down, so it'll recurse into any subdirectories) and replace the tabs with spaces.

These work from a Linux/Mac command line. Windows, you're out of luck.
Edited 2012-02-03 20:34 (UTC)
shadowspar: Pic of Kurama holding a rose (kurama - rose)

[personal profile] shadowspar 2012-02-04 01:01 am (UTC)(link)

There's definitely a lot of ways to accomplish any given task in the *nix environment. One of the Perl mottos is "TMTOWDTI" (There's More Than One Way To Do It), but in a lot of ways that's really true of the Unix culture that Perl grew out of. =)

The settings you're looking for in vim are expandtab (convert tabs to spaces), tabstop (how many spaces a tab counts for), and shiftwidth (how many spaces an indent should be). In my case, I want a four space indent using spaces not tabs, so I have this line in my .vimrc file:

    set expandtab tabstop=4 shiftwidth=4

This article in the vim wiki elaborates a bit more.

Thanks for posting this! Tabs in source files are the bane of my existence too. ^_^;

shadowspar: Picture of ouendan (\o/)

[personal profile] shadowspar 2012-02-04 03:17 pm (UTC)(link)
Yaaaay, so glad to hear! \o/ I think there's a way to do almost anything in vim, but sometimes the path to get there can be a little bit arcane. =)
foxfirefey: Fox stealing an egg. (mischief)

[personal profile] foxfirefey 2012-02-07 12:54 am (UTC)(link)
There's a [community profile] command_liners community, if you like.
pne: A picture of a plush toy, halfway between a duck and a platypus, with a green body and a yellow bill and feet. (Default)

[personal profile] pne 2012-02-06 10:09 am (UTC)(link)
Another way of doing this is using sed, like this:

sed -ie 's/\t/ /g' yourfile.pl


Perl also has an -i switch (I think due, in part, to its originally having to compete with the established sed).

So you could boil down the script to something like perl -i -pe "s/\t/    /g" file1 file2 file3 .
Edited 2012-02-06 10:10 (UTC)