bug-bash
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [A-Z], [:upper:]


From: Greg Wooledge
Subject: Re: [A-Z], [:upper:]
Date: Thu, 28 Mar 2019 17:27:24 -0400
User-agent: NeoMutt/20170113 (1.7.2)

On Thu, Mar 28, 2019 at 09:30:43PM +0100, Norman H. Azadian wrote:
> Description:
>         In version 4 [A-Z] is broken and [:upper:] works.
>       In version 5, the situation is reversed.
> 
> Repeat-By:
>       foo=ABC ; echo ${foo%[A-Z]} ${foo%[:upper:]}

You have two problems here.  Well, four really.

First, your first example invokes platform-defined behavior.  [A-Z]
isn't safe to use unless one of the criteria described below are met:

              [...]  Matches any one of the enclosed characters.   A  pair  of
                     characters  separated by a hyphen denotes a range expres‐
                     sion; any character that falls between those two  charac‐
                     ters,  inclusive,  using  the  current locale's collating
                     sequence and character set, is  matched.   If  the  first
                     character following the [ is a !  or a ^ then any charac‐
                     ter not enclosed is matched.  The sorting order of  char‐
                     acters  in range expressions is determined by the current
                     locale and the values of the LC_COLLATE or  LC_ALL  shell
                     variables, if set.  To obtain the traditional interpreta‐
                     tion of range expressions, where [a-d] is  equivalent  to
                     [abcd],  set  value of the LC_ALL shell variable to C, or
                     enable the globasciiranges shell  option.   A  -  may  be
                     matched by including it as the first or last character in
                     the set.  A ] may be matched by including it as the first
                     character in the set.

Second, your second example should be using [[:upper:]] not [:upper:].
You might be mixing up tr's syntax with glob/regex syntax.

Also, you didn't tell us what result you got, or what result you
expected to see.  And you forgot to quote.

wooledg:~$ var=ABC; echo "${var%[[:upper:]]}"
AB
wooledg:~$ LC_COLLATE=C; var=ABC; echo "${var%[A-Z]}"
AB
wooledg:~$ unset LC_COLLATE; shopt -s globasciiranges; var=ABC; echo 
"${var%[A-Z]}"
AB



reply via email to

[Prev in Thread] Current Thread [Next in Thread]