趣味集算:兩行搞定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的命令行中只要輸入如下命令:
執行后,控制臺就會打印出行號,以及包含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窗口讓它跑一遍,再貼個圖:
看到上述截圖,說明這個代碼確實干活了。它不但能找到文本文件里的串,而且找得還很仔細,它將給定目錄d:/config下的包含子目錄的所有文件都找了出來!
那么問題來了,這門語言是如何處理變量的?比如上述代碼里沒有定義的A1是從哪來的?A1又是個什么類型的變量?不用定義就直接引用?那個賦值的等號,但又沒有賦值對象是啥意思?還有確實沒看到for循環就遍歷了所有文件,是如何實現的?為了說明這些問題,還是得有圖,有圖有真相:
看到圖片,神秘語言也就露出了真容,原來是個叫做集算器的東東。同時,也似乎好理解一些上述代碼了,原來上述語句都是寫在Excel里的啊!且慢,看好了,這個不是Excel,是集!算!器!人家只是長得跟Excel有點像好嗎。不過對于A1是從哪里來的有了解答,原來每個格子的名字就是變量。所以,不用定義變量就可以寫程序了。好吧,那么上述代碼為啥沒有循環呢?看不到循環,并不代表它沒有,你肯定循環了是不是?對對對,循環還是要的,至于到底是如何循環的,依然看圖:
上圖是一個數據內容查看面板,就像調試程序時的watch窗口。左上角的A1表示當前查看的是A1。那成員是什么意思?哦,原來A1就是一個封裝了數組的對象!此時的你有了一個大致的認識。那么第二行代碼中A1.run()在你心中已經有了答案,就是針對這個數組做一個循環嘛!原來如此!然后后面的代碼意思應該就是讀取文件內容,然后比較并輸出到控制臺。還有那個沒賦值對象的等號呢?這里的等號不是賦值的意思,而是表示后面跟上的是需要計算的表達式,沒有等號時就是一些其他的,比如常量、注釋、或者關鍵字等。
至此,只需兩行代碼就搞定GREP搜索,并不是噱頭,是真實可行的,且有實際功能的一個小工具。不過,這文章還是有點標題黨,兩行代碼的GREP并沒有做正則表達式匹配,也還不能支持大文件。那么,怎么才能實現完整的GREP呢?又需要多少行代碼呢?而且,我估計你心中仍有諸多疑惑,這種網格式語言到底有什么用?那種像是封裝了數組的對象又有什么好處?帶著你的好奇,繼續關注潤乾軟件吧。