هل من الممكن استخدام GNU grep للحصول على مجموعة متطابقة من تعبير؟
مثال:
echo "foo 'bar'" | grep -oE "'([^']+)'"
والتي من شأنها إخراج "شريط". لكنني أرغب في الحصول على "شريط" فقط ، دون الحاجة إلى إرساله عبر grep مرة أخرى (أي الحصول على المجموعة المتطابقة). هل هذا ممكن؟
يمكنك استخدام sed
لهذا الغرض. على BSD sed
:
echo "foo 'bar'" | sed -E "s/.*'([^']+)'.*/\\1/"
أو بدون الخيار -E
:
sed "s/.*'\([^']\+\)'.*/\1/"
هذا لا يعمل لإدخال متعدد الأسطر. لذلك تحتاج:
sed -n "s/.*'\([^']\+\)'.*/\1/p"
على الرغم من عدم قدرة grep على إخراج مجموعة معينة ، يمكنك استخدام lookahead وخلف التأكيدات لتحقيق ما بعد الخاص بك:
echo "foo 'bar'" | grep -Po "(?<=')[^']+(?=')"
يمكنك استخدام \K
لإعادة ضبط وتجاهل نص المطابقة اليسرى مع واجهة النظافة التي لم تتم إضافتها إلى نص المطابقة:
$ echo "foo 'bar'" | grep -oP "'\K[^']+(?=')"
bar
جنو grep فقط.