亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

需要多行搜索的regex(Grep)

需要多行搜索的regex(Grep)

斯蒂芬大帝 2019-07-10 09:38:21
需要多行搜索的regex(Grep)我在運行一個grep若要查找任何*.sql文件,請執行以下操作:select后面跟著這個詞customerName后面跟著這個詞from..此SELECT語句可以跨越多行,并可以包含制表符和換行符。我嘗試了以下幾種變體:$ grep -liIr --include="*.sql" --exclude-dir="\.svn*" --regexp="select[a-zA-Z0- 9+\n\r]*customerName[a-zA-Z0-9+\n\r]*from"然而,這只是永無止境。有人能幫我掌握正確的語法嗎?
查看完整描述

3 回答

?
拉風的咖菲貓

TA貢獻1995條經驗 獲得超2個贊

不需要安裝grep變體pcregrep,就可以使用grep進行多行搜索。

$ grep -Pzo "(?s)^(\s*)\N*main.*?{.*?^\1}" *.c

說明:

-P激活grep的perl-regexp(正則表達式的強大擴展)

-z在行尾抑制換行符,將其替換為空字符。也就是說,grep知道行的末尾,但是將輸入看作一個大行。

-o只打印匹配。因為我們用-z,整個文件就像一個大行,所以如果有匹配,整個文件就會被打印出來;這樣它就不會這樣做了。

在regexp:

(?s)激活PCRE_DOTALL,這意味著.查找任何字符或換行符

\N找到除了換行符以外的任何東西,即使PCRE_DOTALL激活

.*?找到,發現.在非貪婪模式下,即盡快停止。

^找到行的開始

\1對第一組的反向引用(\s*)這是試圖找到方法的相同縮進

可以想象,這個搜索在C中打印主方法(*.c)源文件。


查看完整回答
反對 回復 2019-07-10
?
開滿天機

TA貢獻1786條經驗 獲得超13個贊

我在GREP方面不是很好。但是你的問題可以用AWK命令。只是看看

awk '/select/,/from/' *.sql

以上代碼將產生于select直到第一個序列from..現在,您需要驗證返回的語句是否具有customername或者不是。為此,您可以通過管道傳遞結果。并且可以再次使用awk或grep。


查看完整回答
反對 回復 2019-07-10
?
慕勒3428872

TA貢獻1848條經驗 獲得超6個贊

你的根本問題是grep一次只能工作一行,所以它找不到分散在行中的SELECT語句。

第二個問題是,您使用的正則表達式不能處理SELECT和FROM之間可能出現的復雜性-特別是省略逗號、句號(句號)和空白,還包括引號和引號,以及可以在引號中出現的任何內容。

我可能會使用基于perl的解決方案,讓perl一次讀取“段落”,并對此應用正則表達式。缺點是必須處理遞歸搜索-當然,也有一些模塊可以這樣做,包括核心模塊。檔案:查找.

在大綱中,對于單個文件:

$/ = "\n\n";    # Paragraphswhile (<>){
     if ($_ =~ m/SELECT.*customerName.*FROM/mi)
     {
         printf file name
         go to next file     }}

它需要包裝到一個子文件中,然后由File:Find方法調用。


查看完整回答
反對 回復 2019-07-10
  • 3 回答
  • 0 關注
  • 737 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號