التعابير النظامية: أمثلة تطبيقية للمترجم اللينكساوي

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

يتمثل الحل اﻷنجع للمشكلة اﻷولى في استخدام أمر grep، وهي تسمية مختصرة لعبارة "get regular expression". لكن، عوض الحديث عن أمر grep، يجدر بنا الحديث عن "عائلة grep"، وهي عائلة مكونة من ثلاثة أفراد (أو أدوات):
fgrep لمعالجة التعابير النظامية بدون أي رموز خاصة. غياب أنماط البحث المعقدة في هذه الحالة يسمح بربح الوقت والحصول على سرعة أكبر، لكنه يعني أيضاً عدداً أقل من الإمكانيات بالمقارنة مع الصنفين اﻵخرين.
grep لمعالجة التعابير النظامية وفق القواعد المذكورة في الجزء اﻷول من هذه التدوينة. وهي أداة أقل سرعة من fgrep، لكنها تمنح عدداً أكبر من الإمكانيات.
egrep لمعالجة التعابير النظامية الموسعة، مع إمكانية استخدام رموز خاصة مثل الرمز $ أو علامة + لإنشاء تراكيب متطورة وإنجاز عمليات أكثر تعقيداً.
تصاغ أوامر grep على الشكل اﻵتي:

grep [-الخيارات] التعبير النظامي [اسم/أسماء الملف أو الملفات]
فيما يلي سرد لخيارات grep اﻷكثر استخداماً:
الخيار التفسير
v- عرض كافة اﻷسطر التي لا تتطابق مع التعبير النظامي المستخدم.
c- طباعة عدد اﻷسطر المتطابقة فقط دون عرض اﻷسطر في حد ذاتها.
n- عرض اﻷسطر المتطابقة مع ذكر أرقام ترتيبها في الملف الذي وجدت به.
i- تجاهل حالة اﻷحرف، أي عدم التمييز بين اﻷحرف الكبيرة والصغيرة عند إجراء المطابقة.
l- عرض اسم الملف الذي يتضمن التطابق بدل عرض السطر المتطابق في حد ذاته.
s- حذف رسائل اﻷخطاء المتعلقة بالملفات المعطلة أو الغير قابلة للقراءة.
h- عدم عرض أسماء الملفات عند إجراء البحث في ملفات متعددة.
r- قراءة كافة الملفات المتواجدة في مجلد معين ارتكازاً على مبدأ الاستدعاء الذاتي.

 

لنعد اﻵن إلى مثالنا اﻷول. تصور أننا كتبنا الترجمة الإنجليزية لمصطلح "المُصَحِّح" (Debugger) بشكل خاطئ (Debuger) في مجموعة من ملفات xml المخزنة بمجلد معين في الجذر الرئيسي (مثلاً على المسار التالي www/prep-examples/~)، وبأننا نريد اﻵن العثور على الصيغة الخاطئة للترجمة لتصحيحها. بدل فتح كل ملف على حدة والبحث عن الكلمة الخاطئة، فإننا سننتقل إلى المجلد المرغوب من خلال اﻷمر اﻵتي:

cd ~/www/prep-examples

ثم سنستخدم أمر grep للعثور على كافة الملفات التي تتضمن كلمة debuger:

grep -in debuger *.xml

بعد تنفيذ اﻷمر أعلاه، سوف تعرض الطرفية كافة اﻷسطر التي تتضمن كلمة debuger على الشكل التالي:


sampleproject.xml:314:source-level debuger to do it with. This part of the job has been done
recent_project.xml:191:debugers, text editors, mailers and much more. ITS had them
next_project.xml:712:For example, it has convience variables within the debuger so you can

في المقطع المعروض أعلاه، تشير اﻷرقام 314، 191 و712 إلى أرقام اﻷسطر التي تتضمن مصطلح debuger الخاطئ في ملفات sampleproject.xml وrecent_project.xml وnext_project.xml على التوالي.
يمكنك استخدام أوامر grep للبحث عن كلمات أو عبارات معينة في مئات الملفات دون فتحها. لنتفحص اﻵن اﻷمر المستخدم عن كثب. لاحظ بأننا لم نستخدم إلا شرطة عادية واحدة للخيارين i وn، مع أننا نستطيع أيضاً كتابة اﻷمر على الشكل اﻵتي:

grep -i -n debuger *.xml

بالإضافة إلى ذلك، فإن استخدام حرف البدل (*) يسمح لك بإجراء البحث بشكل عام في كافة الملفات المتواجدة بالمجلد. إذا أردت البحث عن صيغتي المفرد والجمع لكلمة debuger، فما عليك سوى وضع حرف البدل في نهاية الكلمة:

grep -in debugers* *.xml

لنفترض مثلاً بأننا لم نستخدم اللفظ الخاطئ debuger فقط، بل أيضاً الكلمة debager كما هو موضح في السطرين 19 و21 بالصورة أدناه:

Regulaere_Ausdruecke_AR


للعثور على المصطلحين الخاطئين معاً، فإننا سنستخدم اﻷمر اﻵتي:

grep -in deb[ua]gers* *.xml

لإيجاد كافة صيغ debuger أو debugers الخاطئة التي تتضمن حرفاً آخر غير حرف u، يمكنك استخدام اﻷمر التالي:

grep -in 'deb[^u]gers*' *.xml

للبحث في كافة المجلدات الفرعية التي يتضمنها المجلد الرئيسي الموجود على المسار "www/~"، يمكننا استخدام اﻷمرين التاليين:

cd ~/www
grep -ilr 'deb[^u]gers*' .

النقطة المتواجدة في نهاية اﻷمر الثاني تشير إلى أن البحث سيجري انطلاقاً من المسار الحالي.
مع مرور الزمن والممارسة المنتظمة، سوف تجد بأن التعابير النظامية تسمح لك بالقيام بمهام أكثر تعقيداً من اﻷمثلة البسيطة التي رأيناها في الجزء الحالي من هذه التدوينة. استخدام سطر اﻷوامر والطرفية يمكنك من إنجاز مهام مضنية في ظرف وجيز. تخيل مثلاً بأنك قد أنشأت نسخة ثانية من مجلد معين، ثم أدخلت بعض التعديلات على ملفات xml ضمنه وأنشأت ملفات متعددة أخرى. لنقل الملفات المستحدثة أو الجديدة بشكل حصري من المجلد الجديد إلى المجلد اﻷصلي، يكفي استخدام اﻷمر التالي في نظام غنو/لينكس:

cp -u *.xml [مسار الوجهة]

استخدام التعابير النظامية يمكنك أيضاً من حذف اﻷجزاء المتكررة التي لا تود ترجمتها في مجموعة معينة من الملفات. معرفة التقنيات اللازمة للقيام بذلك متروكة لاجتهادك الشخصي. كلما تعمقت في هذا المجال الشيق، فإنك ستكتشف طرقاً جديدة للتخلص من المهام المتكررة بشكل نهائي. شكراً لمتابعتك وإلى موضوع مقبل.