العودة إلى المدونة

استخدام Grep و Regex للبحث عن أنماط النصوص

استخدام Grep و Regex للبحث عن أنماط النصوص

إنّ grep هو أداة قوية للبحث عن الأنماط في النصوص. وهو يأتي مثبتًا مسبقًا في أي توزيعة Linux. إليك البرنامج التعليمي الخاص بنا الذي يشرح إعداد حزمة LAMP Stack - Linux و Apache و MySQL و PHP.

يرمز الاسم grep إلى طباعة التعبيرات النمطية العامة (global regular expression print). تبحث الأداة عن النمط المحدد في المدخلات. من حيث المبدأ، يبدو الأمر بسيطًا. ومع ذلك، تكمن قوتها الحقيقية في كيفية تحديدك للنمط. يوضح هذا الدليل بالتفصيل كيفية استخدام grep مع التعبيرات النمطية لإجراء عمليات بحث معقدة. فلنبدأ!

كيفية استخدام Grep

أمر grep بحد ذاته ليس معقدًا. كل ما يتطلبه هو النمط والمحتوى المراد إجراء البحث فيه. هذا هو الشكل الذي تبدو عليه البنية الأساسية لأمر grep:

البحث في النصوص

أولاً، احصل على ملف عينة لتنفيذ الإجراء عليه. قم بتنزيل GNU General Public License v3.0 (بتنسيق نصي). إنه ملف نصي كبير نوعًا ما ويحتوي على الكثير من الكلمات والعبارات. إذا كنت تستخدم Ubuntu فيمكنك العثور عليه في الملف أدناه. اتبع البرنامج التعليمي الخاص بنا لتثبيت Ubuntu سريع وسهل.

download text file grep

بعد ذلك، يمكنك إجراء بحث نصي أساسي باستخدام grep:

grep text

من الممكن تمرير (pipe) مخرجات أمر ما إلى grep:

grep text
حساسية حالة الأحرف

بشكل افتراضي، يتعامل grep مع حالة الأحرف بحساسية. في العديد من الحالات، قد يكون تجاهل حساسية حالة الأحرف هو الخيار الأمثل. لتعطيل البحث الحساس لحالة الأحرف، استخدم العلامة “-i” أو “–ignore-case”:

grep ignore case
عكس البحث

بشكل افتراضي، يقوم grep بطباعة السطور التي تم العثور فيها على النمط. يشير عكس المطابقة (Invert match) إلى الحالة التي لا تريد فيها رؤية السطور التي تطابق النمط. لعكس المطابقة، تحتاج إلى استخدام العلامة “-v” أو “–invert-match”:

invert grep
رقم السطر

عند تشغيل grep على ملف كبير جدًا، يصعب تتبع موقع نتيجة البحث. لتسهيل الأمور، يتميز grep بميزة إظهار رقم السطر. لتمكين ترقيم السطور، استخدم العلامة “-n” أو “–line-number”:

line number grep
من الممكن دمج وسائط grep متعددة. سيقوم أمر grep التالي بإجراء مطابقة عكسية مع طباعة أرقام السطور:

combine arguments of grep

التعبيرات النمطية

في بداية هذا الدليل، ذكرنا أن grep يرمز إلى طباعة التعبيرات النمطية العامة (global regular expression print). يُعرَّف مصطلح “التعبيرات النمطية” بأنه سلسلة نصية خاصة تصف نمط البحث. للتعبيرات النمطية بنيتها وقواعدها الخاصة.

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

المطابقة الحرفية

في أمثلة grep السابقة، قام grep بالبحث عن سلسلة نصية محددة في ملف النص المعطى. كان grep يبحث في الواقع باستخدام التعبيرات النمطية الأساسية للغاية. تُسمى أنماط regex التي تحدد البحث عن المطابقة التامة لسلسلة نصية معينة بـ “الحرفية” (literals). ويأتي هذا الاسم من حقيقة أنها تطابق النمط حرفيًا، حرفًا بحرف.

تعمل المطابقة الحرفية مع الأحرف الأبجدية والرقمية (بالإضافة إلى بعض الأحرف الخاصة). ومع ذلك، قد يتغير هذا السلوك اعتمادًا على آليات التعبير الأخرى:

literal matching grep

مطابقة المرساة

المراسي (Anchors) هي أحرف خاصة تحدد الموضع الذي يجب أن تكون فيه المطابقة في السطر لتكون مطابقة صالحة. إليك مثال سريع لتبسيط الأمر. إذا كنا نبحث فقط عن الأسطر التي تبدأ بسلسلة النصوص "GNU"، فإن أمر grep مع التعبير النمطي (regex) سيبدو كالتالي. هنا، الرمز "^" هو المرساة، وهو يحدد أن المطابقات في بداية السطر هي الوحيدة الصالحة:

anchor match regexp

وبالمثل، إذا كنا نبحث فقط عن الأسطر التي تنتهي بسلسلة النصوص "works"، فإن أمر grep مع التعبير النمطي سيبدو كالتالي. هنا، الرمز "$" هو المرساة، وهو يحدد أن المطابقات في نهاية السطر فقط هي الصالحة:

anchor matching regexp

مطابقة أي حرف

عند إجراء بحث في النص، قد ترغب في تحديد أنه يمكن وجود أي حرف في مكان معين. في التعبيرات النمطية (regex)، يتم التعبير عن ذلك برمز النقطة (.).

ألقِ نظرة على هذا المثال. في ملف نص رخصة GNU GPL 3، تشترك الكلمتان "accept" و "except" في الجزء "cept". علاوة على ذلك، تحتوي كلتا الكلمتين على حرفين قبل الجزء "cept". سيطابق أمر grep التالي أي كلمة تحتوي على حرفين قبل الجزء "cept":

any character match grep

وفقًا لهذا التعبير النمطي، فإن الكلمات الأخرى مثل suscept و unaccept و unexpected وغيرها هي أيضًا مطابقات صالحة.

الأقواس

في التعبيرات النمطية، تحدد تعبيرات الأقواس أنه يمكن وجود أي حرف معلن عنه داخل الأقواس في الموقع المحدد. ألقِ نظرة على سلسلة التعبير النمطي التالية:

عند تطبيق ذلك عمليًا، ستكون الكلمتان too و two هما المطابقتان الصالحتان:

bracket regexp

تفتح تعبيرات الأقواس المجال لبعض الأمور المثيرة للاهتمام. من الممكن استخدام تعبيرات الأقواس لتحديد أنه يمكن وجود أي حرف في الموقع المحدد باستثناء الأحرف المعلن عنها داخل الأقواس. ألقِ نظرة على سلسلة التعبير النمطي التالية. ستكون المطابقة صالحة فقط إذا كان هناك أي حرف غير "c" قبل "ode":

قم بتشغيله على ملف نص رخصة GPL-3:

bracket regexp

إلى جانب النتيجة من الملف، ستكون النتائج الصالحة الأخرى هي node و abode و anode وغيرها. يمكن لتعبيرات الأقواس أيضًا وصف نطاق من الأحرف. يوضح التعبير النمطي التالي أن المطابقة صالحة إذا كانت بداية السطر حرفًا كبيرًا:

قم بتشغيله على ملف نص رخصة GPL-3. ستكون النتيجة جميع الأسطر في الملف النصي:

bracket regexp

لتسهيل الاستخدام، هناك فئات أحرف معينة لها تسميات محددة. في المثال السابق، استخدمنا النطاق "A-Z" لتحديد الأحرف الكبيرة. بدلاً من ذلك، يمكننا أيضًا استخدام "[:upper:]". ستكون النتيجة هي نفسها:

تكرار النمط

في بعض الحالات، قد ترغب في مطابقة نمط معين أو تعبير نمطي صفر أو أكثر من المرات. للقيام بذلك، فإن الحرف التعريفي (meta-character) هو النجمة (*). سيطابق التعبير النمطي التالي جميع الأقواس التي تحتوي فقط على أحرف ومسافات مفردة بينها. لاحظ أن الإعلان عن مجموعات الأحرف الصغيرة والكبيرة والمسافات يأتي معًا دون أي علامات ترقيم:

قم بتطبيق التعبير النمطي عمليًا باستخدام grep:

repeating pattern
استخدام الأحرف التعريفية كأحرف حرفية

حتى الآن، تعرفنا على العديد من المحارف الوصفية (meta-characters) مثل النجمة (*)، والنقطة (.)، والمثبتات (^ و $)، وما إلى ذلك. كل منها يشير إلى وظيفة فريدة في سياق التعبير النمطي (regex). تظهر المشكلة عندما نحتاج إلى استخدامها كمحارف حرفية، وليس كمحارف وصفية. في مثل هذه الحالات، فإن الشرطة المائلة الخلفية (\) أمام المحرف الوصفي ستشير إلى أنه سيتم استخدامه بالمعنى الحرفي، وليس كمحرف وصفي. ألقِ نظرة على مثال التعبير النمطي هذا. سيطابق جميع السطور التي تبدأ بحرف كبير وتنتهي بنقطة:

meta character regexp
التناوب

باستخدام تعبيرات الأقواس، يمكننا تحديد خيارات مختلفة ممكنة لمطابقة محرف واحد. يحتوي التعبير النمطي (Regex) على ميزة للقيام بالشيء نفسه مع الكلمات والعبارات. للإشارة إلى التناوب، يتم استخدام رمز الأنبوب (|). تظل الخيارات داخل أقواس بينما يفصل رمز الأنبوب بينها. يمكن أن يكون هناك خياران محتملان أو أكثر لتكون المطابقة صالحة. ألقِ نظرة على مثال التعبير النمطي التالي. سيطابق كلاً من “GPL” و “General Public License”:

alternate choices of grep
محددات الكمية

باستخدام المحرف الوصفي النجمة (*)، تمكنا من تحديد نمط يتكرر صفرًا أو أكثر من المرات. ومع ذلك، هناك المزيد للعمل معه. من الأسهل شرح محددات الكمية بمثال. يوضح التعبير النمطي التالي أن كلاً من “copyright” و “right” هما مطابقتان صالحتان. تشير علامة الاستفهام (?) إلى أن جزء “copy” اختياري للمطابقة:

quantifiers regexp

محدد الكمية التالي هو رمز الجمع (+). وهو يتصرف بشكل مشابه للنجمة. ومع ذلك، يجب أن يتطابق النمط المحدد مرة واحدة على الأقل. في المثال التالي، سيطابق التعبير النمطي كلمة “soft” متبوعة بمحرف واحد أو أكثر من المحارف غير الفارغة:

تحديد تكرار المطابقة

من الممكن تحديد عدد مرات تكرار المطابقة. للقيام بذلك، استخدم الأقواس المتعرجة ({}). سيطابق التعبير النمطي التالي أي كلمة تحتوي على ثلاثة أحرف متحركة كحد أدنى:

match repetition regexp

تتيح لك هذه الميزة أيضًا تحديد الحد الأدنى والحد الأقصى لطول المطابقة. في المثال التالي، سيتطابق التعبير النمطي مع أي كلمة يتراوح طولها بين 10 إلى 15 محرفًا:

match repetition regexp

الخاتمة

إن البحث في ملفات النصوص باستخدام grep أمر مفيد للغاية. تجعل التعبيرات النمطية البحث باستخدام grep أكثر إثارة للاهتمام وفائدة. كما أنها تضبط نمط البحث بدقة وفقًا لرغبتك.

على الرغم من أننا استعرضنا بعض التعبيرات النمطية الشائعة، إلا أن هذه مجرد البداية. هناك تعبيرات نمطية أكثر تقدمًا توفر تحكمًا دقيقًا للغاية في سلوك البحث. إلى جانب grep، تُستخدم التعبيرات النمطية أيضًا على نطاق واسع بواسطة أدوات ولغات برمجة أخرى.

حوسبة سعيدة!

 

author

Akshay Nagpal

المؤلف · CloudSigma

Preslav Dobrev هو مصمم إبداعي في CloudSigma، يركز على هوية أعمال متسقة باستخدام قنوات التسويق التقليدية والمبتكرة. هو بارع في دمج الرؤية الفنية مع التسويق الاستراتيجي لخلق سرد قصصي مؤثر للعلامة التجارية.

التعليقات

لا توجد تعليقات بعد. كن أول من يعلق.