趣味集算:两行搞定GREP搜索

发布时间:2018-01-29 分类:产品文章 Tag:,,

grep

What?两行代码搞定GREP搜索?如果不是经常使用Linux,估计你看到这个标题后会一脸不屑加满脸狐疑: GREP搜索是个什么鬼?又一个搜索引擎问世?比百度牛x吗?楼主你过来讲讲,你是如何只用两行代码就搞定搜索的。我给你一个关键字,你能还我一堆URL?

误会误会,你就是给我十个关键字,我也还不了一个URL的。因为我说的搜索,不是网络搜索引擎。正如前面提到的,Linux,我说的是Linux下的一个搜索命令,一个叫GREP的命令。 GREP(global search regular expression(RE) and print out the line),它是一种文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。比如我们想搜索一个名为readme.txt的文件中,有哪些行包含了raqsoft。则在Linux的命令行中只要输入如下命令:

grep raqsoft readme.txt

执行后,控制台就会打印出行号,以及包含raqsoft字符串的那些行。

此刻,我想你不禁会问,两行代码就能搞定这么复杂的动作?你不要骗我,俺读书少,可也是写过程序的人,就拿Java来说,光引用包、类名就得好几行,然后你的变量总要有吧,你总得查找文件,写个循环来搜索比对内容吧。问完后就一脸不屑地等着楼主如何自圆其说,楼主要如何不写变量,不写循环,来完成示例中的搜索。因为,此时的你,脑子里面涌现出了下述画面:

import xxx;

import …

public class xx{

String filePath,search;

ArrayList<File> files = 列出filePath的文本文件

for(File f:files){

读取文件f的内容

for(String row:文件内容){

如果包含search,打印行号和文件内容

}

}

}

是的,用常规编程语言来实现文本搜索,少不了变量,离不开循环,不管是用C还是其他语言,浮现的伪代码都跟上面类似,无非是几个关键字的写法不一样。看起来,只写两行代码完成上述功能,是痴人说梦。除非用的是人类语言:“给我打印所有文件中包含search的行出来!”嗯,想象力很丰富,人工智能嘛,呵呵。

 

看来是不信?上代码!

A
1 =directory@ps(path+"/*.txt")
2 =A1.run(file(~).read@n().run(if(pos(~,string(search)),output([A1.~," 第"+string(#)+"行:",~].string()))))

 

啧啧,真地只有两行,果然没有变量,也没有循环!不过看起来怪怪的,居然每行前面还有个奇怪的等号,但又没有被赋值的对象。长得这么奇怪的程序,它真能干活吗?你可能还在怀疑,我写的会不会是一段假代码。不过没关系,初次见面,有陌生感是正常的。

在DOS窗口让它跑一遍,再贴个图:

grep1

看到上述截图,说明这个代码确实干活了。它不但能找到文本文件里的串,而且找得还很仔细,它将给定目录d:/config下的包含子目录的所有文件都找了出来!

那么问题来了,这门语言是如何处理变量的?比如上述代码里没有定义的A1是从哪来的?A1又是个什么类型的变量?不用定义就直接引用?那个赋值的等号,但又没有赋值对象是啥意思?还有确实没看到for循环就遍历了所有文件,是如何实现的?为了说明这些问题,还是得有图,有图有真相:

grep2

看到图片,神秘语言也就露出了真容,原来是个叫做集算器的东东。同时,也似乎好理解一些上述代码了,原来上述语句都是写在Excel里的啊!且慢,看好了,这个不是Excel,是集!算!器!人家只是长得跟Excel有点像好吗。不过对于A1是从哪里来的有了解答,原来每个格子的名字就是变量。所以,不用定义变量就可以写程序了。好吧,那么上述代码为啥没有循环呢?看不到循环,并不代表它没有,你肯定循环了是不是?对对对,循环还是要的,至于到底是如何循环的,依然看图:

grep3

上图是一个数据内容查看面板,就像调试程序时的watch窗口。左上角的A1表示当前查看的是A1。那成员是什么意思?哦,原来A1就是一个封装了数组的对象!此时的你有了一个大致的认识。那么第二行代码中A1.run()在你心中已经有了答案,就是针对这个数组做一个循环嘛!原来如此!然后后面的代码意思应该就是读取文件内容,然后比较并输出到控制台。还有那个没赋值对象的等号呢?这里的等号不是赋值的意思,而是表示后面跟上的是需要计算的表达式,没有等号时就是一些其他的,比如常量、注释、或者关键字等。

至此,只需两行代码就搞定GREP搜索,并不是噱头,是真实可行的,且有实际功能的一个小工具。不过,这文章还是有点标题党,两行代码的GREP并没有做正则表达式匹配,也还不能支持大文件。那么,怎么才能实现完整的GREP呢?又需要多少行代码呢?而且,我估计你心中仍有诸多疑惑,这种网格式语言到底有什么用?那种像是封装了数组的对象又有什么好处?带着你的好奇,继续关注润乾软件吧。