grep 精確匹配字串的兩個部分

grep 精確匹配字串的兩個部分

如何使用 grep 指令取得以下字串的一部分?

細繩:

orange:"orange", red:"apple", purple:"grape", yellow:"banana", green:"watermelon"
red:"strawberries", yellow:"lemon"

我想要的是:

red:"apple" yellow:"banana"
red:"strawberries" yellow:"lemon"

我已經嘗試過這個:

grep -oP '(red:\"[^\"]*).*(yellow:\"[^\"]*)'

答案1

中間.*的匹配所有內容,即purple:"grape"部分。相反(假設您想堅持使用 GNU grep),我將使用(foo|bar)“OR”結構分別匹配每個部分。

grep -oP '(red|yellow):\"[^\"]*"'

注意我必須添加結束語"。另外,您不需要轉義",因此您可以使用

grep -oP '(red|yellow):"[^"]*"'

無論如何,這給你

red:"apple"
yellow:"banana"

然後將線條連接起來,線條之間留有空間,

grep -oP '(red|yellow):"[^"]*"' | paste -sd ' ' -

老實說,我自然會用sed它來代替。

sed -n 's/.*\(red:"[^"]*"\).*\(yellow:"[^"]*"\).*/\1 \2/p'

答案2

grep通常不會離線提取內容。它會列印與常規表達式p匹配的行(一般來說,它以命令命名)。regg/re/p ed

然而,一些實作(例如grep您似乎正在使用的 GNU)需要-o將其中的一些功能作為擴充。

pcregrep甚至更進一步。它-o可以採用可選的數字參數來輸出捕獲組的內容,而不是行的整個匹配部分。

pcregrep -o1 -o2 --om-separator=' ' '(red:"[^"]*").*(yellow:"[^"]*")'

它能做的事情仍然有限。

要從行中提取資訊並進行更多轉換,您需要使用文字sed,而不是像其他人在此處所示的那樣。

答案3

grep你確實可以用as來做由斯帕霍克建議,或幾乎相同:

$  echo 'red:"apple", purple:"grape", yellow:"banana"' |      
        grep -oP '(red|yellow):".+?"' | perl -00pe 's/\n/ /'
red:"apple" yellow:"banana"

就我個人而言,我可能會這樣做perl

$ echo 'red:"apple", purple:"grape", yellow:"banana"' | 
    perl -F, -ane 'map{print if /red|yellow/}@F'
red:"apple" yellow:"banana"

相關內容