2009年2月5日 星期四

FINDSTR進階用法

想搜尋大量文字檔裡的字串,建議FINDSTR一定要學會用,很方便的喔,我這幾天才知道原來有支援一般表示式呢,使用起來更加強大喔

A.利用/G從指定的檔案取得搜尋字串清單(按我看一下會更了解這怎麼用)
  請把下列的"&"替換成shift+\囉,也就是一條直線的管道符號(因blogger把我字給吃了)

findstr /s /i /G:search.txt d:\*.asp & findstr /v /i /G:exclude.txt > c:xx.log

其中 search.txt 是搜尋字串所在的檔案,d:\*.asp加/s是要搜尋D槽下所有asp的檔案,exclude.txt 是要排除的搜尋字串所在的檔案,xx.log則存放搜尋結果。

B.使用一般表示式(Regular Expression)
 以下是FINDSTR所支援的中繼字元,雖沒有很多,但我覺得很夠用囉


 0.跟著我一起練習,會比較了解喔,先把以下綠色文字複製後存成xx.txt,此例是txt是放在f槽,所以下面的語句請自行依情況變換喔


select * from comp
32165469874
select * from accomplish

select * from Comp
546VDFBSF4545
from
select * from comp
select * from COMP
compare


 1.通常若不知道一般表示式怎麼用,想搜尋comp字串,語句可能會長的像下面這行一樣,但是這樣的執行結果會跑出一些我們不需要的結果,如accomplish與compare,如下圖1的地方
findstr "comp" f:\xx.txt
 2. 若知道一般表示式,可以利用"\<"與"\>"來包住comp,限制該字元開頭跟結尾,就可以只找到你要的,就不會跑出accomplish與compare的結果囉,見下圖2的地方
因為這blog會過濾換行字元,所以指令請見圖吧
 3.若只想搜尋comp字串,但是c又不限定大小寫,就可以用中括號來包含字元集合[Cc],意思就是C或c皆可囉,像"[Cc]omp"就是Comp與comp都可,見下圖3
findstr "[Cc]omp" f:\xx.txt


 4若想找開頭為comp的字串,c不分大小寫,見下圖4
findstr "\<[Cc]omp" f:\xx.txt
 5.若想找結尾為comp的字串,c不分大小寫,見下圖5
findstr "[Cc]omp\>" f:\xx.txt
 6.若想找comp的字串,全部不區分大小寫,見下圖6,其實也是可以用"/i" 的
findstr "[Cc][oO][Mm][Pp]" f:\xx.txt


 8.若想找"from comp"字串,中間有一個空格的,可不能直接用"from comp"喔,那可是會找出from或comp的字串啊,所以得用中繼字".",如"from.comp",但是找出的結果可能會有很多,因為"."是萬用字啊,可以替換成任何字元,如圖8
因為這blog會過濾換行字元,所以指令請見圖
 7. 前面已提過"."表示搜索的條件是任意字元,而"*"在一般表示式中的作用不是任意字元喔,而是表示左側字元可以重複的意思,"*"表示重複的次數可為零次或者多次。所以若搜尋字串中使用".*",表示在那字串中可以夾雜0個,1個或很多個任意字元的喔,見下圖7,"from.*comp"的意思就是"from"與"comp"間可以含一個空白或很多空白的意思,在此例囉


 9.範圍[a-z]這種的我就不介紹,因為用起來怪怪的,似乎有問題,網路上我也查到似乎是各bug(Ranges [a-z] and [A-Z] perform INCONSISTENTLY in 2K/XP)


 10."^" 表示行首,"^from"就表示要找一行開頭必須為"from"的囉,其餘的皆不符合,語句如下
findstr "^from" f:\xx.txt
from

 11."$"表示行尾,"comp$"即表示要找一行結尾必須為"comp"的囉
findstr "comp$" f:\xx.txt
select * from comp
select * from  comp

c.利用for迴圈

 介紹到這,當你已了解我前面介紹findstr使用檔案內容當作搜尋清單及一般表示式這兩種用法之後,你就可以把他們結合起來用囉,搜尋清單的內容使用一般表示式,然後如果你再用上for迴圈的話,就可以作到依收尋字串分成數個搜尋結果檔囉!要不然結果全都導入一個檔,之後若要在分類很麻煩的,不如一開始就作好它!那怎麼用呢?語句如下,是一行喔不是兩或三行!要存成bat檔喔! 請把下列的"&"替換成shift+\囉,也就是一條直線的管道符號(因blogger把我字給吃了)
for /f "tokens=1,2 delims=," %%i in (c:\search.txt) do findstr /S /N /R "%%j" D:\svn_meta\*.j* & findstr /v /i /G:exclude.txt > d:%%i.log

我這邊的例子,假設我想找"from travel"及"from zip"這兩個字串,分別希望搜尋結果是導入travel.log及zip.log,search.txt的內容應該長的像下面這兩行
travel,from.travel
zip,from.zip


若看不懂,建議先看我令一篇For的應用

2 則留言:

  1. 請問一下,有辦法在透過bat檔,來取代文章內容嗎?例如我想把文字檔內的所有you改成me,是否可以辦的到呢?

    回覆刪除
  2. to 冰燕
    您可能要透過sed去作喔,去這邊抓來用
    http://gnuwin32.sourceforge.net/packages/sed.htm

    回覆刪除