2015-04-22 52 views
0

我在嘗試grep代碼庫以在引號之間查找字母數字代碼。因此,例如我的代碼庫可能包含線引號之間的Grep模式

some stuff "A234DG3" maybe more stuff 

而且我想輸出:A234DG3

我在這很幸運,我知道我的字符串是7個長,只有整數和字母AZ,az。

後有點玩,我想出了以下內容,但它只是不出來跟想什麼,我

grep -ro '".*"' . | grep [A-Za-z0-9]{7} | less 

我要去哪裏錯了嗎?感覺grep應該給我我想要的東西,但是我最好用別的東西嗎?乾杯!

回答

0

越打越約我拿出這裏面所以以後給我什麼我後:

grep -r -E -o '"[A-Za-z0-9]{7}"' . | less 

隨着-E允許使用{7}長度匹配的

0

使用基本或擴展的POSIX正則表達式無法提取帶有grep的引號之間的值。因爲我會用sed的便攜式解決方案:

sed -n 's/.*\"\([^"]\+\)".*/\1/p' <<< 'some stuff "A234DG3" maybe more stuff' 

然而,有好吃的東西GNU,GNU grep將支持與-P命令行選項PCRE表達式。您可以使用此:

grep -oP '.*?"\K[^"]+(?=")' <<< 'some stuff "A234DG3" maybe more stuff' 

.*"匹配的一切,直到第一次報價 - 包括它。 \K選項會清除匹配的緩衝區,因此可以像一個方便的,動態的lookbehind斷言一樣工作。 (我本來可以使用真實倒映,但我喜歡\K)。 [^"]+匹配引號之間的文本。 (?=")是一個前瞻斷言,比賽結束後的保證將遵循" - 不包括在比賽中。

0

問題是,RE是非常需要匹配它可以的最長的序列。因此,鑑於這樣的:

a "bcd" efg "hij" klm "nop" q 

".*"圖案應符合:"bcd" efg "hij" klm "nop"(一切從第一次報價,以最後一個引號),而不僅僅是"bcd"

你可能想要一個更像01​​的模式匹配開引號,任意數量的其他東西,然後是一個接近引用。