gnu-misc-discuss
[Top][All Lists]
Advanced

[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, address@hidden 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



reply via email to

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