2017-06-01 670 views
1

我使用Unix grep。我想知道如何處理命名捕獲組。用grep命名捕獲組

目前,這是我所:

echo "foobar" | grep -P "(?<q>.)ooba(?<w>.)"

所以理論上,我有q=fw=r,但是我不知道我該如何使用這些變量或者他們移交到下一個命令(例如awk)通過管道。

最後,我想有以下結果:

f r

上面串僅僅是一個例子。捕獲組可以在任何地方,可以是任何數量,並且打印也可以以任何順序。我這樣說是因爲我沒有專門尋找一種方法來提取字符串的最後一個字符和第一個字符,而是一種從字符串中提取儘可能多的變量的方法。我知道使用-o\K(?<=some text).*?(?=some other text)的技巧,但這些只會提取字符串的一部分而不是多個。

+2

grep根本不能訪問捕獲組。 –

+0

如果你可以形成一個https:// stackoverflow,它會有所幫助。com/help/mcve ... – Sundeep

回答

1

逸出他們有9個拍攝組中sed限制從BRE模擬ERE令牌。但是,gawk並非如此。

從你提到的問題中,「而是一種方法來從字符串」「中提取儘可能多的變量。

sed如果您需要玩1-9組,那麼這項工作最適合。如果不是這種情況match功能gawk也是有幫助的。 (使用相同的正則表達式爲Inian)

echo "foobar" | awk '{match($0,/^(.)(.+)(.)$/,a);print a[1],a[3]}' 
f r 

PS:這是一個替代方法可能是,如果有團體處理更多的則9.此外,真正有用的,對於數量較少它工作得很好。還有awk的變量如NR,OFS,FS緊密耦合,因此格式化更容易。

0

grep沒有能力單獨打印已捕獲的羣體,但sed可以與你給出的例子,

echo "foobar" | sed 's/^\(.\)\(.\+\)\(.\)$/\1 \3/' 
f r 

字面上的意思,匹配的第一個字符 - 字符串和最後一個字符的其餘部分。現在,您可以從\1訪問單個捕獲組.. \n符號,

RegEx Demo

之所以圍繞括號\是因爲sed默認使用BRE(基本正則表達式)和 ERE(擴展正則表達式)可以使用-E-r標誌啓用。的ERE不POSIXsed支撐,從而基本上答案通過用\