关于grep的一点小技巧
时间:2006-05-30 来源:riverking23
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处理,就必须对转义字符本身进行转义,这也就是为什么第四例中需要用\\$的原因了。
总结:匹配模式要先经过shell,然后再传给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处理,就必须对转义字符本身进行转义,这也就是为什么第四例中需要用\\$的原因了。
总结:匹配模式要先经过shell,然后再传给grep。推而广之,对于所有的命令和参数都一样,要用到转义或特殊字符的时候要想明白它会被转几次义.....
相关阅读 更多 +