Bash substrings – just can’t figure it out…

Jonathan Hudson jh+ubuntu at daria.co.uk
Tue Jan 31 19:13:06 UTC 2012


On Tue, 31 Jan 2012 19:55:24 +0100, Johnny Rosenberg wrote:

>2012/1/31 Jonathan Hudson <jh+ubuntu at daria.co.uk>:
>> On Tue, 31 Jan 2012 12:31:06 -0600, Cybe R. Wizard wrote:
>>
>>>On Tue, 31 Jan 2012 19:07:20 +0100
>>>Johnny Rosenberg <gurus.knugum at gmail.com> wrote:
>>>
>>>> I have an example here:
>>>> File="03. Rock Nuts.flac"
>>>> echo "${File##N*s}"
>>>>
>>>> The result should be ”03. Rock .flac”, shouldn't it? Obviously not,
>>>> because the result is ”03. Rock Nuts.flac”, which is exactly the
>>>> original string.
>>>> So what am I missing?
>>
>> That it's a string substitution, not a glob or wildcard match.
>
>What's a ”glob”? English is not my native language, sorry. I try the
>best I can though.
>
>> Try
>>
>> $ echo ${File//N*s}
>
>That worked, but somehow I still don't understand exactly why my
>example didn't… *confused*
>
>
First ## is a glob (pattern match), apologies. The reason why your ##
doesn't work is because (a) it is the prefix match, not a suffix match
and (b) it tries to match the whole remainder of the string (which ends
in 'c', not 's), whilst // is a replacement. 

$ echo ${File%%N*c}

illustrates the suffix (end bit) match.

and 

$ echo ${File##03. }

shows the prefix match.

-jh









More information about the ubuntu-users mailing list