grep 的问题

发表于:2007-05-26来源:作者:点击数: 标签:
我用grep'700$'datebook查找包含它的行,结果就是找不到。可是我明明在datebook中有这样的行。求教是不是grep不支持这样的行。 younghawk 回复于:2004-05-09 11:10:12 不好意思,我想问grep是否不支持证规则表达 roxy 回复于:2004-05-09 12:25:59 加个转义

我用 grep '700$' datebook 查找包含它的行,结果就是找不到。可是我明明在datebook中有这样的行。求教是不是grep 不支持这样的行。

 younghawk 回复于:2004-05-09 11:10:12
不好意思,我想问grep 是否不支持证规则表达

 roxy 回复于:2004-05-09 12:25:59
加个转义符试试
grep '700\$' datebook 

egrep支持正则表达式

 wipall 回复于:2004-05-09 12:30:36
grep支持正则表达式。
如果你指的是在dearbook中"存在"处于行末尾的字符串"700",不妨检查一下这些"700"后面是否存在空格。

 younghawk 回复于:2004-05-09 16:34:51
已经检查过了。

 sakulagi 回复于:2004-05-09 16:49:51
我试验了一下。我的redhat el3ws上是可以做到这一点的。

 crknoob 回复于:2004-05-09 22:20:49
估计是你的文件不是UNIX格式的文本文件,而是DOS格式的,区别在于DOS格式的行末尾多一个回车字符^M

 sakulagi 回复于:2004-05-09 22:23:39
有道理。

 yuipr 回复于:2004-05-09 23:55:40
麻烦问一下grep是什么命令呀

 第二场雪 回复于:2004-05-10 21:28:33
查找文本啊~~
不过,楼主可不可以试一下"700$"啊~~,好象''不是什么都转换的~~~
而dos下的文本和unix下的文本有什么区别啊????
如果查找^M这个换行符怎么办啊?
unix下的是^D结束的饿么?

 crknoob 回复于:2004-05-11 09:09:12
那个命令不会有错误的,我用过无数次 grep something$ file.txt了,从来没有问题,问题一定出在文件里,用dos2unix把文件转换成unix格式的在用估计就通过了。

 crknoob 回复于:2004-05-11 09:11:39
用双引号和单引号在本例中没有任何区别,因为表达式里面没有任何需要扩展的内容。

 crknoob 回复于:2004-05-11 09:13:58
[quote:da0e0292cd="roxy"]加个转义符试试
grep '700\$' datebook 

egrep支持正则表达式[/quote:da0e0292cd]

你这个格式明显是理解有错误,按照你这个格式,找的是以 700$ 结尾的行,而不是700结尾的行。

 ailms 回复于:2004-05-11 09:53:48
我试了一下,发现跟文本的格式没有任何关系

在xp下建立一个文件a.txt

内容为:

aaa
bbb$
ccc

复制到linux下用

1) grep $ a.txt (返回文本所有内容)

2) grep \$ a.txt (同上)

3) dos2unix -o a.txt

      再重复上两个命令也不行

4) 最后用

   grep \\$ a.txt 

就返回bbb$

\\$不是表示\$吗?怎么变成表示$了?

请高手指教

 crknoob 回复于:2004-05-11 10:13:02
嘿嘿,你还是没有理解为什么要转义。大致描述如下:

1、grep $ a.txt,$作为正则表达式送给grep解释,意思是匹配行尾,所以匹配所有行,这是容易理解的;

2、grep \$ a.txt,虽然加了转义字符,但是这个转义是在shell完成的,也就是说,参数在传送给grep之前已经经过了转义,由于$是普通字符,因此转义与不转义意义是一样的,经过转义后仍然是$字符,这样从grep的角度来说,接受到的正则表达式与第一例没有任何不通,当然结果一样了;

3、dos2unix转换后的操作,我猜测你是使用ftp传送到linux上的,由于文件名是.txt,ftp在传送时会自动进行文本格式转换,所以到了linux上已经是转换过的文件了,结果当然一样。要正确试验DOS文件,可以这样,先把那个a.txt文件在windows下压缩到.zip文件里面,然后把.zip文件传到linux,再展开.zip得到DOS版的a.txt,相信grep结果肯定不同;

4、grep \\$ a.txt,注意这次的转义是对\本身进行转义,这样grep得到的正则表达式就变成了\$,而不是前面的$,那么grep对\$进行解释时不再将它理解成行结束,而是会将$作为一个普通字符来匹配,所以得到的就是含有$字符的行了。

我上个帖子说的 '700\$' 之所以会匹配包含700$子串的行,是因为单引号组织了shell对表达式进行的扩展,所以整个子串 700\$ 是一起传进grep的,按照第四例的说明,你应该可以很容易理解grep 对它处理的结果了。

根本上要理解的是,linux的shell是会对字符串进行扩展的(处理转义等),如果你想将转义字符传送给grep处理,就必须对转义字符本身进行转义,这也就是为什么第四例中需要用\\$的原因了。

 灰色轨迹 回复于:2004-05-11 10:25:04
4) 最后用 

grep \\$ a.txt 

就返回bbb$ 

\\$不是表示\$吗?怎么变成表示$了? 

在C中如果字符串中有"\"必须用"\\"表示,然后在结合后面的"$"就成了\$,在正则表达式中\$表示字符$而不是字符串结尾。

 crknoob 回复于:2004-05-11 10:55:06
抱歉,刚才以为灰色轨迹是针对我的帖子进行的回复,所以错误的回了一贴,现在自行删除,并自打50大板 ;)

 sakulagi 回复于:2004-05-11 11:09:17
crknoob讲的很详细。很不错!

 younghawk 回复于:2004-05-12 13:51:43
谢谢各位的帮助确实是文件格式的问题

 azerow 回复于:2004-05-13 13:58:17
请问。。。。。。。。。。什么是正则表达式。。。。。。。我真的不知道。

 azerow 回复于:2004-05-13 13:58:17
请问。。。。。。。。。。什么是正则表达式。。。。。。。我真的不知道。

 ch_ch 回复于:2004-07-15 22:27:34
我的试验结果为什么跟你们不一样呢?

文件内容:test.txt
hehe
heihei
heihei$
hei$hei
hei\$hei
heihei

试验结果如下:
1:grep '\\$' test.txt结果是:
heihei
可见,该句命令的意思是:以\结尾的行
2:grep 'i$' test.txt
heihei
hei$hei
hei\$hei
表示以i结尾的行
3:grep 'i\$' test.txt
heihei$
hei$hei
表示含有i$的行
4:grep 'i\$$' test.txt的结果是:
heihei$
该句命令的意思是:以$结尾的行

 aixuc 回复于:2005-08-11 15:07:33
因为你加了单引号 ''
grep '\\$' test.txt 和 grep \\$ test.txt是不一样的

加引号是 \\$被当作一个字符串传给grep解析,\\被转义为\,就是你看到的结果

而不加引号 \\$会被shell先转义成 \$

 aixuc 回复于:2005-08-11 15:12:59
不好意思,我是搜索grep时看到的贴子,回复完才发现是一年前的贴子

原文转自:http://www.ltesting.net