مع المحطة الطرفية: استخدام التعبيرات العادية II: البدائل

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

المزيد عن الأمر grep

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

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

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

curl http://artigoo.com/lista-de-frases-comparativas-comicas 2>/dev/null | sed -n 's/.*\(.*\.\)<\/p>/\1/gp' > frases

 هذا سوف يتركك في الدليل حيث تقوم بتشغيل ملف يسمى «عبارات». يمكنك فتحه لإلقاء نظرة والضحك قليلاً. 🙂

الآن سنفترض أننا نريد إيجاد الجمل التي تتكون من 6 كلمات بالضبط. تكمن الصعوبة في تكوين تعبير نمطي يطابق كل كلمة. الكلمة هي سلسلة من الأحرف إما كبيرة أو صغيرة ، والتي ستكون شيئًا مثل '[a-zA-Z]+'، ولكن عليك أيضًا تحديد أن هذه الأحرف يجب فصلها بأحرف أخرى غير الأحرف ، أي أنها ستكون شيئًا مثل '[a-zA-Z]+[^a-zA-Z]+'. دعنا نتذكر: يشير الحرف "^" كأول حرف داخل الأقواس إلى أننا نريد التطابق مع الأحرف غير الموجودة في النطاقات وتشير "+" إلى حرف واحد أو أكثر.

لدينا بالفعل تعبير عادي يمكن أن يتطابق مع الكلمة. لإقرانه بـ 6 ، يجب تكراره 6 مرات. لذلك استخدمنا المفاتيح ، لكن لا جدوى من وضعها '[a-zA-Z]+[^a-zA-Z]+{6}'، لأن الـ 6 سيكرر الجزء الأخير من التعبير النمطي وما نريده هو تكراره جميعًا ، لذا ما يجب أن نضعه هو: '([a-zA-Z]+[^a-zA-Z]+){6}'. بالأقواس نشكل تعبيرًا فرعيًا وباستخدام الأقواس نكرره 6 مرات. الآن تحتاج فقط إلى إضافة "^" في المقدمة و "$" في الخلف لمطابقة السطر بأكمله. الأمر كما يلي:

grep -E '^([a-zA-Z]+[^a-zA-Z]+){6}$' frases

والنتيجة هي بالضبط ما أردناه:

إنها تغنى أكثر من Macarena. لقد انتهيت أكثر من لويس أغيلي. لديك ثقافة أقل من الحجر. أنت تعرف لغات أكثر من Cañita Brava. لديه تجاعيد أكثر من توتان خامون. أنت تعرف أقل من رامبو عن رعاية الأطفال.

لاحظ أننا وضعنا المعامل -E لأننا نريد استخدام التعبيرات النمطية الموسعة لجعل "+" يعمل. إذا استخدمنا الأساسيات ، فسيتعين علينا الهروب من الأقواس والأقواس.

رجوع المراجع أو المراجع الخلفية

إذا كان لديك مدقق إملائي مثبتًا ، فمن المحتمل أن يكون لديك قائمة بالكلمات /usr/share/dict/words. إذا لم يكن كذلك ، فيمكنك تثبيته في قوس باستخدام:

sudo pacman -S words

أو في دبيان مع:

sudo aptitude install dictionaries-common

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

سنستخدم هذا الملف. اتضح أننا فضوليون للغاية لمعرفة كل المتجانسات المكونة من سبعة أحرف. بالنسبة لأولئك الذين لا يعرفون: المتماثل هو كلمة capicúa ، أي يمكن قراءتها من اليسار إلى اليمين وكذلك من اليمين إلى اليسار. لنجرب الأمر التالي:

grep '^\(.\)\(.\)\(.\).\3\2\1$' /usr/share/dict/words

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

المتداول الأنيلين الأنيلين

دعونا نرى كيف يعمل هذا التعبير النمطي.

بصرف النظر عن الحرفين "^" و "$" ، اللذين نعرف بالفعل الغرض منه ، فإن أول شيء نراه على اليسار هو ثلاث مجموعات من النقاط محاطة بأقواس. لا تخلط بين الأشرطة الموجودة أمام كل قوس. عليهم الهروب من الأقواس لأننا نستخدم التعبيرات النمطية الأساسية ، لكن ليس لها أي معنى آخر. الشيء المهم هو أننا نطلب أي ثلاثة أحرف بها نقاط ، ولكن كل من هذه النقاط محاطة بأقواس. هذا لحفظ الأحرف التي تطابق تلك النقاط بحيث يمكن الرجوع إليها مرة أخرى من التعبير العادي. هذا استخدام آخر للأقواس سيكون مفيدًا لاحقًا عند إجراء عمليات الاستبدال.

هذا هو المكان الذي تأتي فيه الأرقام الثلاثة أدناه بشرطة مائلة أمامها. في هذه الحالة ، الشريط مهم. يتم استخدامه للإشارة إلى أن الرقم أدناه هو مرجع خلفي ويشير إلى أحد الأقواس السابقة. على سبيل المثال: يشير \ 1 إلى القوس الأول ، \ 2 إلى الثاني ، وهكذا.

أي ، مع التعبير النمطي الذي وضعناه ، ما نبحث عنه هو كل الكلمات التي تبدأ بأربعة أحرف ومن ثم يكون لها حرف مماثل للحرف الثالث ، وآخر مماثل للحرف الثاني وآخر مماثل لـ أول. والنتيجة هي المتجانسات المكونة من سبعة أحرف والموجودة في قائمة الكلمات. كما أردنا.

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

تعبيرات الاستبدال: الأمر sed

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

sed [-r] 's/REGEX/REPL/g' FICHERO

أو أيضًا:

COMANDO | sed [-r] 's/REGEX/REPL/g'

حيث سيكون REGEX هو التعبير العادي للبحث و REPL هو التعبير البديل. ضع في اعتبارك أن هذا الأمر لا يحل بالفعل محل أي شيء في الملف الذي نشير إليه ، ولكن ما يفعله هو إظهار نتيجة الاستبدال في الجهاز ، لذلك لا تخف من الأوامر التي سأضعها بعد ذلك. لن يقوم أي منهم بتعديل أي ملفات على نظامك.

لنبدأ بمثال بسيط. لدينا جميعًا ملفات تهيئة متنوعة في الدليل / etc والتي عادةً ما تحتوي على تعليقات تبدأ بـ "#". لنفترض أننا نريد رؤية أحد هذه الملفات بدون التعليقات. على سبيل المثال ، سأفعل ذلك باستخدام fstab. يمكنك أن تجرب مع الشخص الذي تريده.

sed 's/#.*//g' /etc/fstab

لن أضع هنا نتيجة الأمر لأنه يعتمد على ما لديك في fstab الخاص بك ، ولكن إذا قارنت إخراج الأمر بمحتوى الملف ، فسترى أن جميع التعليقات قد اختفت.

في هذا الأمر ، يكون تعبير البحث هو "#.*"، أي" # "متبوعًا بأي عدد من الأحرف ، أي التعليقات. وتعبير الاستبدال ، إذا نظرت إلى الشرطتين المائلتين المتتاليتين ، فسترى أنه لا يوجد أي منها ، لذا فإن ما يفعله هو استبدال التعليقات بلا شيء ، أي حذفها. أبسط مستحيل.

الآن سنفعل العكس. افترض أن ما نريده هو التعليق على جميع أسطر الملف. لنجرب مثل هذا:

sed 's/^/# /g' /etc/fstab

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

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

sed 's/\([A-Z]\)/(\1)/g' frases

ما لدينا هنا هو مرجع خلفي في تعبير الاستبدال يشير إلى الأقواس في تعبير البحث. الأقواس في تعبير الاستبدال هي أقواس عادية. في تعبير الاستبدال ليس لها معنى خاص ، يتم وضعها كما هي. والنتيجة هي استبدال جميع الأحرف الكبيرة بنفس الحرف ، مهما كان ، بأقواس حوله.

هناك حرف آخر يمكن استخدامه أيضًا في تعبير الاستبدال ، وهو "&" ويتم استبداله بكل النص المطابق لتعبير البحث. مثال على ذلك يمكن أن يكون وضع كل الجمل في الملف بين علامتي الاقتباس. يمكن تحقيق ذلك باستخدام هذا الأمر:

sed 's/.*/"&"/g' frases

تشبه عملية هذا الأمر إلى حد كبير الأمر السابق ، والآن فقط ما نستبدله هو السطر بأكمله بنفس السطر مع علامات اقتباس حوله. بما أننا نستخدم "&" فليس من الضروري وضع أقواس.

بعض الأوامر المفيدة ذات التعبيرات العادية

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

  • إظهار أقسام من صفحة الدليل:

man bash | grep '^[A-Z][A-Z ]*$'

بالطبع ، يمكنك تغيير أمر bash إلى ما تريد. وبعد ذلك من الإنسان ، يمكنك الانتقال مباشرة إلى القسم الذي يثير اهتمامك باستخدام تعبير عادي بالطبع. تضغط على "/" لبدء البحث والكتابة "^ALIASES$»للذهاب إلى قسم ALIASES ، على سبيل المثال. أعتقد أن هذا هو أول استخدام بدأته في استخدام التعبيرات النمطية منذ بضع سنوات. يكاد يكون الالتفاف حول بعض صفحات الرجل مستحيلًا بدون خدعة كهذه.

  • عرض أسماء جميع مستخدمي الجهاز بما في ذلك الخاصين:

sed 's/\([^:]*\).*/\1/' /etc/passwd

  • اعرض أسماء المستخدمين ، ولكن فقط أولئك الذين لديهم shell

grep -vE '(/false|/nologin)$' /etc/passwd | sed 's/\([^:]*\).*/\1/g'

يمكن فعل ذلك فعلاً باستخدام تعبير عادي واحد ، لكن طريقة القيام بذلك تتجاوز ما أخبرتك به في هذه المقالات ، لذلك قمت بذلك من خلال الجمع بين أمرين.

  • أدخل فاصلة قبل آخر ثلاثة أرقام من جميع الأرقام في ملف الأرقام:

sed 's/\(^\|[^0-9.]\)\([0-9]\+\)\([0-9]\{3\}\)/\1\2,\3/g' numbers

إنه يعمل فقط مع الأرقام حتى 6 أرقام ، ولكن يمكن استدعاؤه أكثر من مرة لوضع الفواصل في المجموعات الأخرى المكونة من ثلاثة أرقام.

  •  استخراج جميع عناوين البريد الإلكتروني من ملف:

grep -E '\<[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}\>' FICHERO

  • افصل بين اليوم والشهر والسنة لجميع التواريخ التي تظهر في ملف:

sed -r 's/([0-9]{2})[/-]([0-9]{2})[/-]([0-9]{4})/Día: \1, Mes: \2, Año: \3/g' FICHERO

  • اكتشف عنوان IP المحلي الخاص بنا:

/sbin/ifconfig | grep 'inet .*broadcast' | sed -r 's/[^0-9]*(([0-9]+\.){3}[0-9]+).*/\1/g'

يمكن القيام بذلك أيضًا باستخدام أمر sed واحد ، ولكن من الأفضل أن أقوم بفصله إلى grep و sed من أجل البساطة.

بعض العناوين المفيدة

فيما يلي بعض العناوين التي قد تكون مفيدة فيما يتعلق بالتعبيرات النمطية:

  • مكتبة التعبير العادي: هي مكتبة تعبير عادي حيث يمكنك البحث عن التعبيرات العادية المتعلقة بالموضوع الذي يثير اهتمامك. للبحث عن عناوين الويب أو المعرف أو أيا كان.
  • RegExr: مدقق تعبير عادي عبر الإنترنت. يسمح لك بإدخال نص وتطبيق تعبير عادي عليه ، إما بحث أو استبدال. يعطي معلومات حول التعبير النمطي ولديه بعض الخيارات لتغيير سلوكه.
  • اختبار التعبيرات العادية: هو ملحق لمتصفح فايرفوكس يسمح لك بالتحقق من التعبيرات العادية من المتصفح.

اختتام

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

يا! …يا! …استيقظ! ... ماذا تنامون جميعًا؟ 🙂

المصادر

تم أخذ بعض الأفكار والأمثلة للتعبيرات العادية في هذه المقالة من هنا:


15 تعليقات ، اترك لك

اترك تعليقك

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها ب *

*

*

  1. المسؤول عن البيانات: ميغيل أنخيل جاتون
  2. الغرض من البيانات: التحكم في الرسائل الاقتحامية ، وإدارة التعليقات.
  3. الشرعية: موافقتك
  4. توصيل البيانات: لن يتم إرسال البيانات إلى أطراف ثالثة إلا بموجب التزام قانوني.
  5. تخزين البيانات: قاعدة البيانات التي تستضيفها شركة Occentus Networks (الاتحاد الأوروبي)
  6. الحقوق: يمكنك في أي وقت تقييد معلوماتك واستعادتها وحذفها.

  1.   إيلاف قال

    ببراعة !!!

    1.    هيكسبورغ قال

      انه ليس سيئا جدا ولكن شكرا جزيلا لك. اتمنى ان يحبها الناس 🙂

      1.    أوسكار قال

        أنا أحب ذلك ها!

        1.    هيكسبورغ قال

          ثم لابد أنني فعلت شيئًا صحيحًا. هههه!! 🙂

          شكرا جزيلا لتعليقك لك.

          1.    بلير باسكال قال

            اللعنة ، استمر في الكتابة يا رجل ، استمر في ذلك.

          2.    هيكسبورغ قال

            Blaire Pascal: التعليقات مثل تعليقاتك تشجعها. 🙂 شكرا جزيلا لك !!

      2.    سيتوكس قال

        اعجبني ايضا ... شكرا 🙂

        1.    هيكسبورغ قال

          شكرا لك على التعليق. أتمنى أن أكتب المزيد. 🙂

  2.   ماريانو قال

    مشاركاتك رائعة ، تتعلم الكثير ، بل تتعلم أداء المهام بطريقة أنيقة وفعالة.

    هل فكرت في جمع كل منشورات برنامج شل النصي؟ إذا تم فرزها في ملف pdf ، فسيكون هذا دليلًا رائعًا.

    ابتهج وشكرا جزيلا لك!

    1.    هيكسبورغ قال

      شكرا جزيلا!! إنها ليست فكرة سيئة. في الوقت الحالي ، يوجد اثنان فقط ، لكنني سأفكر في الأمر لاحقًا. 🙂

  3.   كيوف قال

    مقالة جيدة جدا ، 5+.

    1.    هيكسبورغ قال

      شكرا. أنا سعيد أنها أعجبتك. 🙂

  4.   سيباستيان قال

    ممتاز! أحتاج إلى تغيير التعبير التالي ولا أعرف كيف أفعل ذلك:
    192.168.0.138/Server بواسطة 192.168.0.111/data
    تكمن المشكلة في رمز "/".
    أنا أستخدم الأمر:
    تجد. -name "* .txt" -exec sed -i 's / TEXT1 / TEXT2 / g' {} \؛
    ما يتم استخدامه لأداء هذا النوع من المهام باختصار ، لكن لا يمكنني ...
    لا أحد يعرف كيف أفعل ذلك؟
    عناق!
    صبا

    1.    هيكسبورغ قال

      ما عليك فعله هو الهروب من هذه الشخصية:

      تجد. -name "* .txt" -exec sed -i 's / \ / Server / \ / data / g' {} \؛

      يمكنك أيضًا استخدام فاصل آخر في sed. لا يجب أن يكون بارًا. يسمح Sed بأي شخصية ليتم استخدامها. على سبيل المثال ، سيكون هذا أوضح:

      تجد. -name "* .txt" -exec sed -i 's | / Server | / data | g' {} \؛

      وإذا كنت تنوي نسخ ولصق الأوامر من هذا التعليق ، فاحرص على استخدام علامات الاقتباس ، حيث يقوم WordPress بتغييرها للأوامر المطبعية. 🙂

      تحية.

  5.   سيباستيان قال

    ممتاز !!!!
    لقد كنت أبحث عن هذا الحل لفترة طويلة.
    هنا أترك الأمر الكامل الذي استخدمته

    تجد. -name "* .txt" -exec sed -i 's | 192 \ .168 \ .0 \ .238 \ / Server | 192 \ .168 \ .0 \ .111 \ / data | g' {} \؛

    ميزة هذا الأمر أنه يغير جميع ملفات .txt (أو الامتداد الذي تريده) بشكل متكرر ... عليك أن تكون حذرًا للغاية!
    لكنها مفيدة جدا !!!

    حسنًا ، شكرًا على كل شيء وألف تهنئة للمجموعة بأكملها.
    أنا دائما أقرأها من البريد!
    العناق
    صبا