![](/img/trans.png)
[英]Difference between using grep regex pattern with or without quotes?
[英]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.