سؤال

كنت بحاجة إلى العثور على كافة الملفات التي تضمنت سلسلة معينة نمط.الحل الأول الذي يتبادر إلى الذهن هو استخدام البحث الأنابيب مع xargs grep:

find . -iname '*.py' | xargs grep -e 'YOUR_PATTERN'

ولكن إذا كنت بحاجة إلى العثور على الأنماط التي تمتد على أكثر من سطر واحد ، أنا عالقة بسبب الفانيليا البقرى لا يمكن العثور على متعدد الأنماط.

هل كانت مفيدة؟

المحلول

حتى اكتشفت pcregrep والتي تقف على بيرل متوافق التعبيرات العادية البقرى.

على سبيل المثال ، تحتاج إلى العثور على الملفات فيها '_name'متغير immediatelly تليها '_description'متغير:

find . -iname '*.py' | xargs pcregrep -M '_name.*\n.*_description'

Tip:تحتاج إلى تضمين كسر خط حرف في النمط الخاص بك.اعتمادا على النظام الأساسي الخاص بك, أنها يمكن أن تكون ' ' ', ' \ن' ، ...

نصائح أخرى

لماذا لا تذهب awk:

awk '/Start pattern/,/End pattern/' filename

هنا هو مثال باستخدام جنو grep:

grep -Pzo '_name.*\n.*_description'

-z/--null-data علاج إدخال وإخراج البيانات مثل متواليات من الخطوط.

انظر أيضا هنا

grep -P كما يستخدم libpcre ، ولكن كثيرا أكثر تثبيته على نطاق واسع.أن يجد كاملة title قسم من وثيقة html, حتى لو كان يمتد خطوط متعددة ، يمكنك استخدام هذا:

grep -P '(?s)<title>.*</title>' example.html

منذ على PCRE المشروع تنفذ إلى بيرل القياسية ، باستخدام بيرل الوثائق المرجعية:

هنا هو أكثر فائدة على سبيل المثال:

pcregrep -Mi "<title>(.*\n){0,5}</title>" afile.html

فإنه يبحث علامة العنوان في ملف html حتى لو كان يمتد حتى 5 خطوط.

هنا هو مثال غير محدود من الخطوط:

pcregrep -Mi "(?s)<title>.*</title>" example.html 

مع الفضة الباحث:

ag 'abc.*(\n|.)*efg'

سرعة أمثل من الفضة الباحث يمكن أن يلمع هنا.

يمكنك استخدام البقرى البديل نخل هنا (تنويه:أنا المؤلف).

دعم متعدد مطابقة والحد من البحث على ملف معين أنواع من خارج منطقة الجزاء:

sift -m --files '*.py' 'YOUR_PATTERN'

(البحث عن كافة *.py الملفات المحددة متعدد regex نمط)

وهي متوفرة على جميع أنظمة التشغيل الرئيسية.نلقي نظرة على عينات الصفحة لنرى كيف أنها يمكن أن تستخدم لاستخراج متعدد القيم من ملف XML.

هذا الجواب قد تكون مفيدة:

Regex (grep) متعدد خط البحث المطلوبة

أن تجد متكرر يمكنك استخدام الأعلام -R (العودية) و تشمل (غلوب نمط).انظر:

استخدام البقرى --استبعاد/--تشمل بناء الجملة لا البقرى خلال بعض الملفات

perl -ne 'print if (/begin pattern/../end pattern/)' filename

باستخدام ex/vi محرر globstar الخيار (جملة مشابهة awk و sed):

ex +"/string1/,/string3/p" -R -scq! file.txt

حيث aaa هو نقطة البداية ، bbb هو نهاية النص.

البحث متكرر ، في محاولة:

ex +"/aaa/,/bbb/p" -scq! **/*.py

ملاحظة:لتمكين ** بناء الجملة, تشغيل shopt -s globstar (باش 4 أو zsh).

@مارسين:awk سبيل المثال غير الجشع:

awk '{if ($0 ~ /Start pattern/) {triggered=1;}if (triggered) {print; if ($0 ~ /End pattern/) { exit;}}}' filename
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top