GNU Grep seçilen bir grubu üretebilir mi?


47

Bir ifadeden eşleşen bir grup elde etmek için GNU grep kullanmak mümkün mü?

Örnek:

echo "foo 'bar'" | grep -oE "'([^']+)'"

Hangi "bar" çıkar. Ancak bir kez daha grep ile göndermek zorunda kalmadan sadece "bar" ı almak istiyorum (yani eşleşen grubu elde etmek istiyorum). Mümkün mü?

Yanıtlar:


50

Bunun için kullanabilirsiniz sed. BSD'de sed:

echo "foo 'bar'" | sed -E "s/.*'([^']+)'.*/\\1/"

Veya, -Eseçenek olmadan :

sed "s/.*'\([^']\+\)'.*/\1/"

Bu çok satırlı giriş için çalışmıyor. Bunun için ihtiyacınız var:

sed -n "s/.*'\([^']\+\)'.*/\1/p"

Teşekkürler, sed'i unutmuştum. Ama açıklığa kavuşturmak için, sed argüman almaz -E ..
Torandi

Hm, makinemde var (Mac OS X). Daha fazla inceleme üzerine, man sayfasında: "-E, -a ve -i seçenekleri standart olmayan FreeBSD uzantılarıdır ve diğer işletim sistemlerinde bulunmayabilir."
jtbandes

1
-R benim için öyle görünüyor.
Torandi

1
@jtbandes: Benim sadece 3 çıkış karakterleri gerektirir .. Bu ifade için genişletilmiş özellikler gerekmez ( ) +kullanımı \( \) \+: Bu etkin aynıdır:sed "s/.*'\([^']\+\)'.*/\1/"
Peter.O

2
Bu çok satırlı giriş için çalışmıyor. İhtiyacınız için: sed -n "s/.*'\([^']\+\)'.*/\1/p"
phreakhead 10:12

28

Grep belirli bir grubu çıkartamazken, neyin peşinde olduğunu elde etmek için bakış açısını ve iddiaların arkasını kullanabilirsiniz:

echo "foo 'bar'" | grep -Po "(?<=')[^']+(?=')"


8
grep -Ptüm platformlarda mevcut değildir. Fakat eğer öyleyse, geriye / arkasına bakmak sorunu çözmenin çok güzel bir yoludur.
Sébastien

1
Grep, geriye dönük iddialarda zekice midir? Uzun görünüşlülerle nasıl performans gösterir? Görünenleri, regex'in geri kalanıyla bir çeşit "sonek ağacı" na entegre ediyor mu?
Ross Rogers

3

\KSol taraftaki eşleme metnini, eşleme metnine eklenmemiş bir görünümle birlikte sıfırlamak ve silmek için kullanabilirsiniz :

$ echo "foo 'bar'" | grep -oP "'\K[^']+(?=')"
bar

Sadece GNU grep.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.