Strip trailing whitespace from files

17,103

Solution 1

$1 is a positional parameter; it will expand to the first argument passed to the script. There are similarly $2, $3...$9, ${10}, ${11},...

The special parameter "$@" will expand to a list of all the positional parameters.

So you can do the following:

sed -i 's/[ \t]*$//' "$@"

If you want to pass a glob/pattern to this script (or to any program), it must be escaped or quoted when you call the script - this is a function of the shell; it will expand any patterns before your script even sees it. This case shouldn't need that - the shell can expand the pattern, and the results of that expansion all get passed to sed.

Solution 2

I find it easy to just use sed with xargs as follows:

find . -name "*.xml" | xargs sed -i 's/[ \t]*$//'

find . -type f | grep cc | xargs sed -i 's/[ \t]*$//'

Share:
17,103

Related videos on Youtube

Alen Milakovic
Author by

Alen Milakovic

Updated on September 18, 2022

Comments

  • Alen Milakovic
    Alen Milakovic over 1 year

    The answer to removing trailing whitespace with sed has most of the answer, but I want

    sed -i 's/[ \t]*$//' $1
    

    to be able to take arbitrary number of file arguments as a shell script on the command line, including glob arguments. I.e. suppose the script is called strip_trailing_whitespace. Then I'd like to be able to do both

    strip_trailing_whitespace foo.cc bar.cc
    

    and

    strip_trailing_whitespace *.cc *.hh
    

    to strip trailing whitespaces from all files of the form *.cc and *.hh. Arguments not based on the answer quoted above are also fine.

  • Shawn J. Goff
    Shawn J. Goff over 12 years
    Exactly the same way: echo "$@". Using the parameter doesn't change it in any way, so you can reference $@ (or any other parameter: positional, special or not) as many times as you want.
  • Alen Milakovic
    Alen Milakovic over 12 years
    Yes, I realised that after I posted, but was apparently too slow to remove the question. :-)
  • 0xC0000022L
    0xC0000022L about 11 years
    keep in mind -i.bak, too ... not to mention that sometimes I come across some variant of sed without -i :) ... +1, still.
  • Robert Audi
    Robert Audi about 10 years
    This doesn't work with the version of sed that ships with OS X. Instead, install gnu-sed (brew install gnu-sed) and replace sed with gsed in the command.