2015-03-31 59 views
2

egrep -f regexlist inputfile顯示未使用的圖案顯示我inputfile所有行是 在regexlist匹配任何正則表達式。egrep的-f regexlist inputfile中:在regexlist

我想知道regexlist中的任何行是否未使用。

換句話說,我可以從 regexlist中刪除哪些行(正則表達式)以獲得相同的結果?

有沒有一種有效的方法來做到這一點?我可以想到幾個效率低下的方法(例如,一次只測試一個模式,或者甚至使用egrep -v修改輸入文件或某物)。

有點棘手的問題:如何在 regexlist中有效地找到多餘的行?換句話說,正則表達式匹配行 在inputfile,但只有已被其他 正則表達式匹配的行regexlist

+0

這是一個很好的問題。我懷疑這是否有預構建的工具,但如果你自己編寫了grep(或編輯它),你可能能夠相對便宜地追蹤這些信息(至少對於第一部分來說,第二部分將是昂貴的不管你怎麼做,我認爲你需要保持每個模式匹配的所有行的列表,並不斷比較這些列表)。 – 2015-03-31 16:13:50

+0

我可以編寫一個egrep,將'inputfile'中的每行與'regexlist'中的每個正則表達式進行比較,但看起來確實很昂貴。當然egrep更有效率(在這種情況下寫我自己的可能是一個壞主意)。我想我可以從模式列表中刪除一個模式來檢查一旦它匹配,但仍然看起來更醜陋。 – barrycarter 2015-03-31 16:55:05

+0

我想有可能是正則表達式分析工具,可以用來找到完全多餘的模式(這是模式,只有匹配的東西一些其他模式已經匹配),但我不知道任何非正式。我實際上並不是建議寫你自己的grep,我的觀點更多的是,不要*在* grep/etc中。過程我想不出任何非昂貴的方式來做到這一點。但是*如果您正在進行此過程,那麼爲此所需的跟蹤應該不會很困難。 – 2015-03-31 17:03:42

回答

1
grep -vf outputfile regexlist 

其中outputfile是通過egrep -of regexlist inputfile > outputfile派生的。

這是一個可以接受的解決方案,因爲我要求您在第一個grep中使用-o開關?

工作原理:

  1. 使用您只匹配匹配你的文件regexlist中提供的字符串的精確匹配(而不是整個行)-o開關。

  2. 您捕獲文件outputfile內的匹配項。 outputfile僅包含在inputfile中找到的那些字符串。

  3. 使用grep的-v開關打印輸出文件中與輸入文件中的任何行不匹配的所有行(打印所有不匹配的行)。這些都是從regexlist行,從來沒有從inputfile

注匹配任何東西:我這個答案的過程中,這適用於目前在regexlist,而不是實際的正則表達式規則的字符串中實現。

+0

嗯,我只有一年的時間太晚了...... – 2016-03-27 08:54:12

+0

我花了幾秒鐘的時間才明白爲什麼會這樣。也許添加一個簡短的解釋?當你知道的時候,這很明顯,但作爲答案,這可能令人費解。儘管如此,我仍然讚不絕口。 – tripleee 2016-03-27 09:10:17

+0

當然,編輯。也意識到一個相當顯着的限制:( 我曾經使用這種技術的字符串,不完全正則表達式。 – 2016-03-28 19:57:09