more bash! regex substitution to crop trailing whitespaces

Madison Kelly linux-5ZoueyuiTZhBDgjK7y7TUQ at public.gmane.org
Tue Dec 18 19:51:44 UTC 2007


Hi all,

   I am almost done this darn bash script of mine (insane as it is), but 
I've got one hurdle I can't seem to get over... It *should* be the last 
hurdle for me to finish this things and start the long process of 
regaining some sanity.

   I read in key=value pairs from a file, which is easy enough. I can 
cut off preceeding white spaces just fine with:

-=-=-=-=-
if [[ "$line" =~ "(.*)=(.*)" ]]; then
{
	# Assign the lhs (left-hand-side) to 'KEY', and the rhs to 'VAL'.
	KEY=${BASH_REMATCH[1]};
	VAL=${BASH_REMATCH[2]};
	echo ">> Pair - key: [${KEY}]	-	val: [${VAL}]."

	# Leading spaces off of VAL
	if [[ "$VAL" =~ '(\s+)(.*)' ]]; then
	{
		VAL=${BASH_REMATCH[2]};
	}
	fi

	# Trailing spaces off of VAL; FAILS!
	if [[ "$VAL" =~ '(.*)(\s+)$' ]]; then
	{
		VAL=${BASH_REMATCH[1]};
	}
	fi
{
fi
-=-=-=-=-

   But I can't get trailing spaces cut off. The '(.*)(\s+)' pattern 
doesn't match because it's greedy and matches to the end of the string. 
This:

-=-=-=-=-
echo "val: [${VAL/\s+/}]";
-=-=-=-=-

   Doesn't match because '\s' is not treated as 'whitespace' and 
'[:blank:]' seems to be plain out ignored...

   I've been reading and search and head->desk-ing for hours now... The 
closest I've found, doc-wise, is this from 'man bash':

-=-=-=-=-
        ${parameter/pattern/string}
        ${parameter//pattern/string}
               The  pattern is expanded to produce a pattern just as in
               pathname  expansion.   Parameter  is  expanded  and  the
               longest  match  of pattern against its value is replaced
               with string.  In the first form, only the first match is
               replaced.  The second form causes all matches of pattern
               to be replaced with string.  If pattern begins  with  #,
               it  must match at the beginning of the expanded value of
               parameter.  If pattern begins with %, it must  match  at
               the  end  of the expanded value of parameter.  If string
               is null, matches of pattern are deleted and the  /  fol‐
               lowing  pattern may be omitted.  If parameter is @ or *,
               the substitution operation is applied to each positional
               parameter  in  turn,  and the expansion is the resultant
               list.  If parameter is  an  array  variable  subscripted
               with  @  or  *, the substitution operation is applied to
               each member of the array in turn, and the  expansion  is
               the resultant list.
-=-=-=-=-

   However, I seem to be failing to grasp something...

help?  :)

Madi
--
The Toronto Linux Users Group.      Meetings: http://gtalug.org/
TLUG requests: Linux topics, No HTML, wrap text below 80 columns
How to UNSUBSCRIBE: http://gtalug.org/wiki/Mailing_lists





More information about the Legacy mailing list