2020国产成人精品视频,性做久久久久久久久,亚洲国产成人久久综合一区,亚洲影院天堂中文av色

分享

grep的兩個(gè)替代品(補(bǔ)充?)

 灬木木的花灬 2015-09-15

GREP是我很常用的命令,尤其在瀏覽代碼時(shí),可以用它來搜索一個(gè)變量/函數(shù)在哪些文件里面被引用了。

但grep有一些不爽的地方,這兩天看到了兩個(gè)跟grep類似的東東,可以在一定場景彌補(bǔ)grep的不足,甚至是替代它。

ACK

http:///

ack的廣告詞是“better than grep, a source code search tool for programmers”,它旨在解決grep用在寫代碼時(shí)的諸多不爽:

1. 排除一些不需要搜索的文件/目錄

在寫代碼時(shí),我們常常會(huì)有.svn, .cvs這些目錄,還有 foo~, #foo#這些臨時(shí)文件/備份文件,以及一些二進(jìn)制文件。要在grep命令行排除這些目錄,是很麻煩的的,因?yàn)閭鹘y(tǒng)grep并沒有這個(gè)能力,而是要結(jié)合find來使用:

grep pattern $(find . | grep -v .svn | grep -v .cvs | egrep -v '~$' | egrep -v '^#')

這不僅很繁瑣,而且在文件很多時(shí)會(huì)因命令過長而出錯(cuò)。如果是在Windows系統(tǒng)上就相當(dāng)讓人抓狂了(是的,你可以用一個(gè)msys或者cygwin提供的bash來作為shell,以便它支持上述復(fù)雜的shell命令,但調(diào)用其它Windows程序的地方又悲劇了)。

而ack的解決辦法很簡單:把這些東西內(nèi)置到程序里,搜索時(shí)自動(dòng)忽略這些文件。

 

2. 讓grep只搜索某些類型的文件,但要求搜索子目錄

grep可以搜索子目錄(用-R選項(xiàng)),但這種情況下你就不能再指定文件類型,所以傳統(tǒng)的方法也是結(jié)合find來折騰:

grep pattern $(find . -name '*.pl' -or -name '*.pm' -or -name '*.pod' | grep -v .svn)

在GNU grep 2.5版本上,你可以用 --include=PATTERN --exclude=PATTERN 這兩個(gè)選項(xiàng)來過濾文件類型:

grep -R pattern --include='*.pl' --include='*.pm' --include='*.pod' --exclude=.svn

這個(gè)命令行也挺長,而且你得有個(gè)GNU grep >= 2.5。

ack的解決思路是:1)缺省就搜索子目錄;2)對(duì)常用編程語言,ack里面寫好了對(duì)應(yīng)哪些文件擴(kuò)展名,比如perl是.pl, .pm和.pod,那么你只要指定按perl這個(gè)語言搜就行了。于是上述命令可以簡化為:

ack --perl pattern

如果只想排除perl類型的文件,則可以用:

ack --noperl pattern

你可以--type-add TYPE=.ext[,ext2[,...]]或者--type-set TYPE=.ext[,ext2[,...]]來臨時(shí)定制文件類型(如果要長期使用,可以修改~/.ackrc。

同時(shí),也許你已經(jīng)注意到了,其實(shí)ack也可以用來替代那一大堆find命令,用來搜索指定類型的文件本身(而不是文件內(nèi)容),ack當(dāng)然也支持,只需要添加-f 選項(xiàng)就行了:

ack -f --perl

 

ack的其它特點(diǎn)

  • 支持pcre
  • 缺省支持顏色,而且會(huì)比較智能地不使用顏色
  • 支持很多grep的選項(xiàng),比如-A(--after-context), -B(--before-context), -C(--context), -H(--with-filename), -i(--ignore-case), -v(--invert-match), -w(--word-only)......

安裝

Debian/Ubuntu上改名叫ack-grep了,用apt-get install ack-grep就可以裝上了(命令名也是叫ack-grep而不是ack)。
ack是用perl5寫的,并沒有什么第三方依賴,所以在其它系統(tǒng)上安裝也很簡單,只要從CPAN安裝App::Ack模塊就可以了。另外該網(wǎng)站還提供了一個(gè)單文件版本(standalone version),只要下載后放到bin目錄就行了(前提是安裝了perl5)。
對(duì)于Windows,我用perl2exe做了個(gè)純粹單文件版本: ack.exe

 

glark

http://www./projects/glark

與ack關(guān)注點(diǎn)不一樣的是,glark跟關(guān)注文件里面的內(nèi)容,舉兩個(gè)例子說一下:

% glark --and=2 printStackTrace catch *.java

這表示在java代碼中搜索printStackTrace和catch這兩個(gè)詞,要求這兩個(gè)詞出現(xiàn)的位置相差不超過2行;

 

% glark --or catch throw *.java

這表示要求搜出包含catch或者throw的行;

 

% glark --and=5 cout --or double float *.c

這表示要求某行包含double或者float,然后在其上下5行內(nèi)有cout出現(xiàn)。

 

glark也支持pcre,也缺省支持高亮文件名和匹配文字,也缺省忽略非文本文件,還跟grep的命令行選項(xiàng)保持很高的兼容性。

glark是用ruby寫的,也沒什么第三方依賴。

glark也已經(jīng)被Debian/Ubuntu收入(lenny開始就有了),用apt-get install glark即可安裝.





    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多