Comments on Simplest way of stripping leading/trailing whitespace from file or program output
Parent
Simplest way of stripping leading/trailing whitespace from file or program output
What is the simplest shell idiom for stripping leading and trailing whitespace from a file or program output? Ideally I am looking for the equivalent of trim
or strip
methods in some languages.
The ideal solution should
- skip empty lines at the beginning and end of the file/stream
- provide an option to also strip leading and trailing whitespace from all non-empty lines
Post
The simple and obvious solution:
sed 's/^ *//;s/ *$//'
Many recipes you find online will erroneously add a g
flag, but these regular expressions can only match once per line anyway.
(In some more detail, s/from/to/g
says to replace all occurrences of from
on the current input line; but of course, if you know from
can only match once, you don't want or need that. It is harmless as such, of course, but betrays a cargo cultish lack of understanding of the construct.)
Your requirement to treat the first and last lines differently seems odd to me, but sed
easily allows you to do that too.
sed '1s/^ *//;$s/ *$//'
This adds the address expression 1
to the first command (which matches on line number 1) and the address $
to the last (which matches the final input line).
If your sed
implementation doesn't support stringing multiple commands together with ;
as shown above, you can pass in the script piecemeal with multiple -e
options.
sed -e '1s/^ *//' -e '$s/ *$//'
The regular expressions above specifically target literal spaces. If you want to target any whitespace, replace each
with [[:space:]]
, which is a POSIX character class which matches one whitespace character of any kind (space, tab, etc).
Something similar could be achieved with Awk with a clever RS
(record separator) but I'd consider that more obscure, as well as probably slower.
1 comment thread