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时看到的贴子,回复完才发现是一年前的贴子 |