Strip trailing whitespace from files
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]*$//'
Related videos on Youtube
Alen Milakovic
Updated on September 18, 2022Comments
-
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 bothstrip_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 over 12 yearsExactly 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 over 12 yearsYes, I realised that after I posted, but was apparently too slow to remove the question. :-)
-
0xC0000022L about 11 yearskeep in mind
-i.bak
, too ... not to mention that sometimes I come across some variant ofsed
without-i
:) ... +1, still. -
Robert Audi about 10 yearsThis doesn't work with the version of
sed
that ships with OS X. Instead, installgnu-sed
(brew install gnu-sed
) and replacesed
withgsed
in the command.