2011-12-22 27 views
36

yakalama grubu:grep: Ben dizisini izleyen var

{"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234} 

ve ben bu örnekte 1234 "plan sürümü", değerini almak gerekir. Bunu nasıl yapabilirsiniz ancak

"scheme_version":1234 

döndürür

Ben

grep -Eo "\"scheme_version\":(\w*)" 

denediniz mi? Biliyorum sed aramasını ekleyebilirim, ama bunu tek grep ile yapmayı tercih ederim.

+0

Sadece 'grep' ile mümkün olduğunu sanmıyorum. Birkaç yıl önce, çoğu zaman 'sed' ya da 'kes' gibi şeylere greps atmak için dize manipülasyonu ile çok şey yaptım. 'Borulama' ve 'kesim' komutlarını incelemenizi tavsiye ederim. –

+0

Çok sık grep kullanmıyorum, ancak belki de http://stackoverflow.com/questions/1247812/im-stuck-in-trying-to- adresindeki kabul edilen yanıtta belirtildiği gibi geriye dönük bir ifade kullanabilirsiniz. grep şey-just-sonrası isim. –

+1

[jq] kullanın (https://stedolan.github.io/jq) –

cevap

37

Bu sizin için işe yarayabilecek:

echo '{"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234}' | 
sed -n 's/.*"scheme_version":\([^}]*\)}/\1/p' 
1234 

Maalesef o değil grep, bu nedenle isterseniz bu çözümü göz ardı edin.

Ya grep ile sopa ve ekleyin:

grep -Eo "\"scheme_version\":(\w*)"| cut -d: -f2 
+0

Bu benim için en uygun seçenek gibi görünüyor. – lstipakov

52

o maçın dahil değildir, böylece iddianın arkasında bir göz kullanmanız gerekir:

grep -Po '(?<=scheme_version":)[0-9]+'

+0

Hmm Grep aldım: -P seçeneği için destek bu derlenmez --disable-perl-regexp ikili – lstipakov

+4

@Stipa PCRE desteği olmadan geri dönüşleri desteklemediğinden grep ile istediğinizi yapamazsınız, yani '\ 1' – SiegeX

+1

+1' -P' perl great! – kev

30

bu iş için jq kullanmanızı öneriyoruz. jq, bir komut satırı JSON işlemcisidir.

$ cat tmp 
{"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234} 

$ cat tmp | jq .scheme_version 
1234 
+1

Jq hakkında bilmeden hayatımda nasıl çalıştım. Vay. Teşekkürler! – brian

-1

Bunu yapabilirsin:

$ echo '{"_id":"scheme_version","_rev":"4-cad1842a7646b4497066e09c3788e724","scheme_version":1234}' | awk -F ':' '{print $4}' | tr -d '}' 
+1

Bu kod bloğu OP'nin sorusunu yanıtlayabilirken, bu kodun bu kodun sorudaki koddan nasıl farklı olduğunu, neyi değiştirdiğinizi, niçin değiştirdiğinizi ve neden niçin çözdüğünüzü açıklarsanız çok daha yararlı olacaktır. başkalarını tanımadan problem. – davejal

14

SiegeX önerdiği pozitif olan ileriye dönük yöntemine alternatif olarak, doğrudan \K çıkış sırası ile scheme_version": sonra maç başlangıç ​​noktası sıfırlayabilir. Ör

$ grep -Po 'scheme_version":\K[0-9]+' 

Bu scheme_version": eşleşti sonra eşleştirme işlemini yeniden başlatır ve Pozitif Geriye İlerleme çok daha iyi bir performansa sahip olma eğilimindedir. Regexp101'deki ikiyi karşılaştırmak, reset match start yönteminin 37 ve 1 ms'leri aldığını gösterirken, pozitif lookbehind yöntemi 194 ve 21 ms'leri alır.

Sen regex101 ilişkin performans kendinizi karşılaştırabilirsiniz ve PCRE documentation yılında maç başlangıç ​​noktası sıfırlama hakkında daha fazla bilgi edinebilirsiniz.

+0

Bu, ihtiyacım olan _exactly_; Teşekkürler! – mklbtz