[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: grep is screwed on Debian, Ubuntu and others ...
From: |
Lew Pitcher |
Subject: |
Re: grep is screwed on Debian, Ubuntu and others ... |
Date: |
Thu, 03 May 2012 22:05:54 -0400 |
On Thursday 03 May 2012 21:25, in comp.unix.shell, kaz@kylheku.com wrote:
> http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=655293
>
> I ran into this doing a simple grep job that needed to match upper
> case characters, and so I started Googling. This was only reported in
> January.
>
> But the Red Hat people knew about what looks like the same bug two years
> ago. Oops, they didn't share!
>
> https://bugzilla.redhat.com/show_bug.cgi?id=583011
>
> (So much for the spirit of collaboration in open source. My distro, my
> patches, screw you!)
>
> Watch this:
>
> $ echo a | grep '[A-B]'
> a
> $ echo b | grep '[A-B]'
> $ echo b | grep '[:upper:]'
> $ echo B | grep '[:upper:]'
> $ echo E | grep '[:upper:]'
> $ echo e | grep '[:upper:]'
> e
Hmmm... A couple of observations
First, IIRC, the grep character classes (such as [:upper:]) syntatically
substitute for the "list of characters" that are enclosed by the square
brackets.
Consequently, the alternate form of '[A-B]' is not '[:upper:]', but instead
is '[[:upper:]]'. That is, the '[:upper:]' is enclosed within a set of
square brackets, just like 'A-B' is.
Thus, your examples that use
grep '[:upper:]'
should only match the characters ':', 'u', 'p', 'e', or 'r', something that
your final example /does/ show.
Second; I guess that your abberent grep behaviour wrt 'a' is version
dependant. Under GNU grep 2.5.3 (32bit Slackware Linux 12.2), I don't see
the same results. In fact, I see the results you'd properly expect from
grep.
~ $ grep -V
GNU grep 2.5.3
Copyright (C) 1988, 1992-2002, 2004, 2005 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE.
~ $ for element in a b A B e ;
> do
> echo "Using $element into grep [A-B]"
> echo $element | grep '[A-B]'
> echo "Using $element into grep [:upper:]"
> echo $element | grep '[:upper:]'
> echo "Using $element into grep [[:upper:]]"
> echo $element | grep '[[:upper:]]'
> done
Using a into grep [A-B]
Using a into grep [:upper:]
Using a into grep [[:upper:]]
Using b into grep [A-B]
Using b into grep [:upper:]
Using b into grep [[:upper:]]
Using A into grep [A-B]
A
Using A into grep [:upper:]
Using A into grep [[:upper:]]
A
Using B into grep [A-B]
B
Using B into grep [:upper:]
Using B into grep [[:upper:]]
B
Using e into grep [A-B]
Using e into grep [:upper:]
e
Using e into grep [[:upper:]]
HTH
--
Lew Pitcher