
csh/grep problem (on Linux)
[ Article reposted from comp.os.linux.misc,comp.unix.questions ]
[ Author was Roy Gordon <r...@shell1.ncal.verio.net> ]
[ Posted on Mon, 03 Jan 2000 06:30:57 GMT ]
[ Whoops, this also looks like an appropriate group! -- roy ]
My other ISP runs Linux and there seems to be the following grep/egrep
problem when I run csh. The problem does not arise with bash or ksh.
Here's the problem:
When '^' is the first character in the grep/egrep search pattern
and '*' appears in the filname position, grep/egrep treat '^'
as a literal and not as a metacharacter.
I have two files, junk and junk1. They differ only in that '^' is
the first character in junk1.
67 > cat junk
sql
68 > cat junk1
^sql
77 > egrep 'sql' j* ; show that filename expansion is working
junk:sql
junk1:^sql
78 >
Now, look at the following:
71 > egrep '^sql' j*
junk1:^sql
72 >
This isn't correct!! '^' as the first character in a grep/egrep
search pattern is a metacharacter standing for the beginning of a
line. But it's being interpreted literally here. So it matches.
Notice that if I use junk1 instead of j* that it gets it right.
72 > egrep '^sql' junk1
73 >
That is, the pattern isn't found because the requesting pattern is
'sql' at the beginning of a line. (The first line in junk1 is '^sql',
where '^' is simply another character in the file, so it doesn't match
with 'sql' at the beginning of the line.)
Similarly, things work properly if I put in both file names explicitly:
80 > egrep '^sql' junk junk1
junk:sql
81 >
If I run bash (or ksh) instead of csh, they get it right. For example,
in bash:
73 > bash
bash$ egrep '^sql' j*
junk:sql
bash$
Again, csh gets it wrong, but only when a * is in the filename:
I don't have this problem on the various Solaris and SunOS 4.X systems
I have access to, just on this Linux system.
For what it's worth, here's what 'uname -a' on the Linux system shows:
Linux bolt 2.0.36 #1 Tue Nov 24 05:29:56 PST 1998 i686
-- Roy