it-swarm.asia

GNU Grep seçilen bir grubu çıkartabilir mi?

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 et). Mümkün mü?

46
Torandi

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

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

Veya, -E seçeneği 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"
49
jtbandes

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 "(?<=')[^']+(?=')"

28
Aldrik

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

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

Sadece GNU grep.

2
drewk