簡體   English   中英

引號之間的Grep模式

[英]Grep pattern between quotes

我正在嘗試grep代碼庫以找到引號之間的字母數字代碼。 因此,例如我的代碼庫可能包含以下行

some stuff "A234DG3" maybe more stuff

我想輸出:A234DG3

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

玩了一段時間之后,我想出了以下幾點,但並沒有得出我想要的結果

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

我在哪里錯了? 感覺grep應該給我我想要的東西,但是我最好還是使用其他東西嗎? 干杯!

使用基本或擴展的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斷言一樣工作。(我本可以使用真正的 lookbehind,但是我喜歡\\K )。 [^"]+匹配引號之間的文本。 (?=")是一個先行斷言,確保比賽之后的保證將遵循" --而不包括在比賽中。

問題在於,非常需要RE才能匹配最長的序列。 因此,給定類似:

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

模式".*"應該匹配: "bcd" efg "hij" klm "nop" (從第一個引用到最后一個引用的所有內容),而不僅僅是"bcd"

您可能想要一個更像"[^"]*"來匹配開引號,任意數量的其他東西,然后匹配一個右引號。

因此,經過更多的討論之后,我想出了這個,它可以為我提供以下幫助:

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

使用-E允許使用{7}長度匹配器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM