话说小工具GREP
不知是哪一天,我也记不起了,GREP遇上了我,不对应该说是我发现了它,它是一个c++Builder自带命令行小工具,这看似一个本起眼的小程序,但可能关键的时候它却能给你带来极大的方便,我就有过一段这样的经历,是这样的,我当时正在做一个关于桌面主题的程序,用到了OCR_NORMAL这个鼠标参数,本来我想改变一下我的样式以显示我这个程序的风采,哪晓得天公不作美一编译就出现了”Undefined symbol 'OCR_NORMAL'符号未错误,这个错误本身很简单,只要找到定义它的头文件就Over了,但如何才能在在VCL这众多的头文件声明中找到它的定义呢!这可能是一件多么庞大的工程啊,但Grep的出现,情况发生了很大的变化,借助于Grep的帮忙,很快地就解决这个问题。
编译错误如下:
[C++ Error] Unit1.h(47): E2451 Undefined symbol 'OCR_NORMAL'
解决办法:
D:\Program Files\Borland\CBuilder6\Include> grep OCR_NORMAL *.h
File winuser.h:
#define OCR_NORMAL 32512
#define OCR_ICON 32641 /* OBSOLETE: use OCR_NORMAL */
哦,原来“OCR_NORMAL”是在winuser.h头文件里的一个宏定义,接下来,我想你也知道该如何解决了吧!其实,当出现[C++ Error] Unit1.h(47): E2451 Undefined symbol 'OCR_NORMAL'类似的错误时,只要按一下”F1”就会出现grep的身影,只是你注没有注意到罢了,下面就是我的一次(按下F1)的结果:
Possible Causes
Actual declaration of identifier has been commented out.
Misspelling, either at this point or at the declaration.
An error in the declaration of the identifier.
The header file in which the identifier is declared was not included using #include
Tools to help track down the problem:
GREP
好了,话不多说,还是让我们回到Grep的主题上来,我打算从以下四个方面来介绍Grep:
1: Grep的语法结构
2: 常用的Command-line Options
3: 字符或字符串模式匹配
4: Example的剖析
Grep的语法:
grep [-options] searchstring [file(s) ... ]
提示:如果Grep的结果很长,你可以使用|more进行分屏显示,也可以将其重定向到文件中进行分析。
分屏显示:grep “cin” *.h |more
重定向到文件:grep “cin” *.h >readme.txt
常用的Command-line Options:
-c 只显示搜索字符串所在文件的行数,当然肯定要列出搜索字符串所在文件的文件名
-d 它决定是否搜索子目录,默认不会设置该属性
-I 忽略字符的大小写,如:”Sub”与”SUb”等价
-l 只显示搜索字符串所在文件的文件名
其它的属性如:-u,-v,-z等你可以参考在线帮助。
字符或字符串模式匹配
字符或字符串模式匹配简单地说就是你如何设置字符或字符串的匹配方式以使你能尽快地得到结果。其实,它主要涉及到一些特殊字符的处理。比如:空格与Tab一般被当着命令参数的分隔符,但有时要匹配的字符串它本身由包含空格或Tab,这时你如何处理,明智的做法是将要匹配的字符用引号栝起来,这就是字符或字符串的匹配方式。那些特殊的符号主要包括在下表中:
* 匹配任意的字符或字符串,可以为空
+ 与*差不多,但不可以为空,如:hell+与hell就不匹配,hell*与hell是匹配的
[ ] 匹配[ ]中的任何一个,如:he[mpl]与hem,hep,hel都匹配,与hello不匹配
[^] 与[ ]恰好相反,它与除了[ ]中的其它字符匹配, he[mpl]与hem,hep,hel不匹配,与hex匹配
[-] 用来表示一个集合,如[0-9]中的任何一个匹配
\ 使\ 它后面的一个字符转义 ,如:*本来表示通配符,但用在它的后面就只表示一个普通的”*”字符
Example的剖析:
grep -i [a-c]:\\data\.fil *.c *.inc
参数-i会忽略大小写,[a-c]表示字符a到c中的任何一个就可以与其匹配,\\转义的结果是”\”所以以下都是[a-c]:\\data\.fi可匹配的字符串:
a:\daDa.fil
c:\Data.Fil