it-swarm.asia

هل يمكن [GNU Grep إخراج مجموعة محددة؟

هل من الممكن استخدام GNU grep للحصول على مجموعة متطابقة من تعبير؟

مثال:

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

والتي من شأنها إخراج "شريط". لكنني أرغب في الحصول على "شريط" فقط ، دون الحاجة إلى إرساله عبر grep مرة أخرى (أي الحصول على المجموعة المتطابقة). هل هذا ممكن؟

46
Torandi

يمكنك استخدام sed لهذا الغرض. على BSD sed:

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

أو بدون الخيار -E:

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

هذا لا يعمل لإدخال متعدد الأسطر. لذلك تحتاج:

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

على الرغم من عدم قدرة grep على إخراج مجموعة معينة ، يمكنك استخدام lookahead وخلف التأكيدات لتحقيق ما بعد الخاص بك:

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

28
Aldrik

يمكنك استخدام \K لإعادة ضبط وتجاهل نص المطابقة اليسرى مع واجهة النظافة التي لم تتم إضافتها إلى نص المطابقة:

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

جنو grep فقط.

2
drewk