كيف يمكنني البحث عن نمط متعدد في الملف ؟
-
02-07-2019 - |
سؤال
كنت بحاجة إلى العثور على كافة الملفات التي تضمنت سلسلة معينة نمط.الحل الأول الذي يتبادر إلى الذهن هو استخدام البحث الأنابيب مع 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 -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
يمكنك استخدام البقرى البديل نخل هنا (تنويه:أنا المؤلف).
دعم متعدد مطابقة والحد من البحث على ملف معين أنواع من خارج منطقة الجزاء:
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