كيف تتحقق مما إذا كانت سلسلة Bash تحتوي على سلسلة فرعية على Linux

نشرت: 2022-09-21
كمبيوتر محمول Linux يعرض موجه bash
fatmawati achmad zaenuri / Shutterstock.com

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

لماذا هذا مفيد؟

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

ينعم مستخدمو Linux بأي عدد من الأدوات المساعدة لمعالجة النص. بعضها مدمج في Bash shell ، والبعض الآخر يتم توفيره كأدوات مساعدة أو تطبيقات قائمة بذاتها. هناك سبب لخدمة أنظمة التشغيل المشتقة من Unix بوفرة مع إمكانيات معالجة السلاسل.

كيفية التعامل مع الجمل في Bash على Linux
ذات صلة كيفية التعامل مع السلاسل في Bash على Linux

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

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

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

البحث عن السلاسل الفرعية باستخدام Bash Builtins

يمكن استخدام الأقواس المزدوجة " [[...]] " اختبار مقارنة السلاسل في عبارات if لتحديد ما إذا كانت إحدى السلاسل تحتوي على سلسلة أخرى.

انسخ هذا النص في محرر ، واحفظه في ملف يسمى “double.sh”.

 #! / بن / باش

إذا [["قرد" = * "مفتاح" *]] ؛ ومن بعد
  صدى "المفتاح في القرد"
آخر
  صدى "المفتاح ليس في القرد"
فاي 
كيفية استخدام Double Bracket Conditional Tests في Linux
ذات صلة كيفية استخدام Double Bracket Conditional Tests في Linux

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

 chmod + x double.sh 

إنشاء نص قابل للتنفيذ باستخدام chmod

لنقم بتشغيل البرنامج النصي.

 ./double.sh 

تشغيل البرنامج النصي double.sh

يعمل هذا لأن علامة النجمة " * " تمثل أي تسلسل من الأحرف ، بما في ذلك عدم وجود أحرف. إذا كان "المفتاح" موجودًا داخل السلسلة الهدف ، مع وجود أي أحرف أمامها أو خلفها أو بدونها ، فسيعود الاختبار صحيحًا.

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

من أجل المرونة ، يمكننا تعديل البرنامج النصي الخاص بنا للتعامل مع المتغيرات بدلاً من السلاسل الحرفية. هذا هو النص "double2.sh".

 #! / بن / باش

سلسلة = "قرد"
سلسلة فرعية = "مفتاح"

إذا [[$ string = * $ substring *]]؛ ومن بعد
  صدى "تم العثور على سلسلة فرعية $ في سلسلة $"
آخر
  صدى "لم يتم العثور على سلسلة فرعية $ في سلسلة $"
فاي

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

 ./double2.sh 

تشغيل البرنامج النصي double2.sh

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

هذا هو النص "double3.sh".

 #! / بن / باش

shopt -s nocasematch

سلسلة = "قرد"
سلسلة فرعية = "مفتاح"
العاصمة = "لندن"

check_substring ()
{
إذا [[$ 1 = * $ 2 *]] ؛ ومن بعد
  صدى "تم العثور على $ 2 في $ 1"
آخر
  صدى "لم يتم العثور على $ 2 في $ 1"
فاي
}

check_substring "القرد" "مفتاح" 
check_substring $ string $ substring
check_substring $ سلسلة "الموز"
check_substring "ويلز" $ capital

نسمي دالة check_substring بنا باستخدام مزيج من المتغيرات والسلاسل الحرفية. استخدمنا shopt -s (set) لضبط nocasematch ، لجعل المطابقات غير حساسة لحالة الأحرف.

هنا كيف يعمل.

 ./double3.sh 

تشغيل البرنامج النصي double3.sh

يمكننا أيضًا استخدام خدعة التفاف السلسلة الفرعية بعلامات نجمية في عبارات case . هذا هو "case.sh."

 #! / بن / باش

shopt -s nocasematch

string = "Wallaby"
سلسلة فرعية = "جدار"

حالة $ سلسلة في

  * $ substring *)
    صدى "تم العثور على سلسلة فرعية $ في سلسلة $"
    ؛؛

  *)
    صدى "لا شيء مطابق: $ string"
    ؛؛
esac

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

 ./case.sh 

تشغيل البرنامج النصي case.sh

تم العثور على السلسلة الفرعية.

العثور على السلاسل مع grep

بعيدًا عن بنيات Bash ، فإن أداة البحث عن النص الأولى التي من المحتمل أن تصل إليها هي grep . يمكننا استخدام القدرة الفطرية لـ grep للبحث عن سلسلة داخل سلسلة للبحث عن سلاسلنا الفرعية.

يسمى هذا البرنامج النصي "subgrep.sh."

 #! / بن / باش

string = "وعاء العصيدة"
سلسلة فرعية = "ريدج"

إذا $ (echo $ string | grep -q $ substring) ؛ ومن بعد
  صدى "تم العثور على سلسلة فرعية $ في سلسلة $"
آخر
  صدى "لم يتم العثور على سلسلة فرعية $ في سلسلة $"
فاي

يستخدم البرنامج النصي echo لإرسال السلسلة إلى grep ، والتي تبحث عن السلسلة الفرعية. نحن نستخدم الخيار -q (الهدوء) لإيقاف كتابة grep لأي شيء بالمخرجات القياسية.

كيفية استخدام أمر grep على نظام Linux
ذات صلة كيفية استخدام الأمر grep على لينكس

إذا كانت نتيجة الأوامر داخل الأقواس " (...) " تساوي صفرًا ، فهذا يعني أنه تم العثور على تطابق. نظرًا لأن الصفر يساوي true في Bash ، فإن عبارة if يتم استيفائها ويتم تنفيذ جملة then .

دعونا نرى ما هو ناتجها.

 ./subgrep.sh 

تشغيل البرنامج النصي subgrep.sh

العثور على السلاسل الفرعية مع sed

يمكننا استخدام sed لإيجاد سلسلة فرعية أيضًا.

بشكل افتراضي ، تطبع sed كل النص الذي يتم إدخاله فيه. استخدام sed -n يمنع ذلك. الأسطر الوحيدة التي تتم طباعتها هي أسطر متطابقة. سيطبع هذا التعبير أي سطور تطابق أو تحتوي على قيمة السلسلة الفرعية $.

 "/ $ substring / p"

نقوم بتغذية قيمة $string في sed باستخدام إعادة توجيه هنا ، <<< . يستخدم هذا لإعادة توجيه القيم إلى أمر في الغلاف الحالي. إنه لا يستدعي قشرة فرعية بالطريقة التي يستدعيها الأنبوب.

كيفية استخدام الأمر sed على لينكس
ذات صلة كيفية استخدام الأمر sed على لينكس

أول -n هو الاختبار. سيعود true إذا كان الناتج من الأمر sed غير صفري. الطريقة الوحيدة التي يمكن أن يكون بها الإخراج من sed غير صفرية هي العثور على سطر مطابق. إذا كان الأمر كذلك ، فلا بد أنه تم العثور على $substring $string .

هذا هو "subsed.sh".

 #! / بن / باش

سلسلة = "السويد"
سلسلة فرعية = "عدن"

إذا [-n "$ (sed -n" / $ substring / p "<<< $ string)"]؛ ومن بعد
  صدى "تم العثور على سلسلة فرعية $ في سلسلة $"
آخر
  صدى "لم يتم العثور على سلسلة فرعية $ في سلسلة $"
فاي

نحصل على الاستجابة المتوقعة عند تشغيل البرنامج النصي.

 ./subsed.sh 

تشغيل البرنامج النصي subsed.sh

يمكننا اختبار منطق البرنامج النصي بتحرير قيمة $substring حتى تفشل المقارنة.

./subsed.sh

تشغيل البرنامج النصي subsed.sh بسلسلة فرعية لا مثيل لها

توقف عن البحث ، وجدتها

يمكن للأدوات الأخرى العثور على سلاسل فرعية ، مثل awk و Perl ، لكن حالة الاستخدام البسيطة مثل العثور على سلسلة فرعية لا تضمن وظائفها الإضافية ولا التعقيد الإضافي. على وجه الخصوص ، يعد استخدام Bash buildins للبحث عن السلاسل الفرعية سريعًا وبسيطًا ولا يتطلب أدوات خارجية.

ذات صلة: كيفية استخدام بيانات الحالة في نصوص Bash