如何使用 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
匹配的行(一般來說,它以命令命名)。r
e
g
g/re/p
ed
然而,一些實作(例如grep
您似乎正在使用的 GNU)需要-o
將其中的一些功能作為擴充。
pcregrep
甚至更進一步。它-o
可以採用可選的數字參數來輸出捕獲組的內容,而不是行的整個匹配部分。
pcregrep -o1 -o2 --om-separator=' ' '(red:"[^"]*").*(yellow:"[^"]*")'
它能做的事情仍然有限。
要從行中提取資訊並進行更多轉換,您需要使用文字s
流ed
,而不是像其他人在此處所示的那樣。
答案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"