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

How Check If String Contains Substring Bash



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

String by Escaping Spaces. سلسلة من خلال الهروب من المسافات

يمكن إنشاء سلسلة من خلال استبدال كل مسافة بتسلسل هروب المسافة ، '' ؛ مثل:







myVar= السياحة في مصر هي واحدة من الدولة 'ق رائدة اقتصادية الصناعات.
رما - طرد - قذف $ myVar

الخرج هو:



السياحة في مصر هي واحدة من الصناعات الاقتصادية الرائدة في البلاد.



ملاحظة: استخدمت الفاصلة العليا أيضًا تسلسل الهروب من الفضاء.





سلسلة باقتباسات مفردة

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

myVar='السياحة في مصر من البلاد' ''الصناعات الاقتصادية الرائدة.'

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



السياحة في مصر هي واحدة من الصناعات الاقتصادية الرائدة في البلاد.

سلسلة بعلامات اقتباس مزدوجة

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

myVar= السياحة في مصر هي واحدة من الدولة 'ق رائدة اقتصادية الصناعات.
رما - طرد - قذف $ myVar

الخرج هو:

السياحة في مصر هي واحدة من الصناعات الاقتصادية الرائدة في البلاد.

ملاحظة: استخدمت الفاصلة العليا أيضًا تسلسل الهروب من الفضاء.

في هذه المقالة ، النوع الرئيسي للسلسلة المدروسة هو السلسلة الموجودة في علامات الاقتباس الفردية.

أساسيات التعبير العادي

Regex

ضع في اعتبارك هذه السلسلة:

هذا العالم ليس حقا وطننا.

دع العالم يكون محور الاهتمام. بعد ذلك ، تسمى السلسلة الكبيرة (السلسلة الكاملة) السلسلة الهدف أو ببساطة الهدف. يُطلق على 'العالم' في علامات الاقتباس التعبير العادي أو ببساطة التعبير العادي. المحتوى ، العالم ، هو النمط ، في هذه الحالة.

مطابقة بسيطة

في الكود التالي ، إذا تم العثور على كلمة 'world' في الهدف ، فسنقول إن الكلمة قد تمت مطابقتها.

ص='هذا العالم ليس حقًا وطننا'.
ريج='العالمية'
لو [[ $ شارع= ~ريج دولار ]]؛من ثم
رما - طرد - قذفوجدت
آخر
رما - طرد - قذفغير موجود
يكون

= ~ ، وهو عامل التخصيص متبوعًا بـ ~ ، يسمى عامل الربط. يتحقق الشرط مما إذا كان النمط مطابقًا في السلسلة الهدف. إذا تم العثور على سلسلة فرعية مقابلة للنمط في الهدف ، يتم عرض عبارة echo. إذا لم يتم العثور عليها ، فلن يتم العثور على صدى بيان الصدى. ناتج هذا الرمز هو:

وجدت

كما تم العثور على النمط ، العالم ، في الهدف. لاحظ أنه تم الحفاظ على مسافة التحديد بعد [[وقبل]].

نمط

في الكود أعلاه ، 'العالم' بين علامات الاقتباس هو التعبير العادي بينما العالم نفسه هو النمط. هذا نمط مباشر. ومع ذلك ، فإن معظم الأنماط ليست بهذه البساطة. النمط هو توصيف لسلسلة فرعية يتم العثور عليها. وهكذا ، يستخدم نمط Bash أحرفًا أولية معينة. الحرف الأولي هو حرف يتعلق بالشخصيات الأخرى. على سبيل المثال ، يستخدم Bash Pattern الأحرف الأولية التالية:

^ $ . * +؟ () [] {} |

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

فئات الأحرف

أقواس مربعة

تم العثور على ناتج الكود التالي ، مما يعني حدوث تطابق:

ص='جاءت القطة إلى الغرفة.'
لو [[ $ شارع= ~[cbr]في]]؛من ثم
رما - طرد - قذفوجدت
يكون

يطابق النمط [cbr] at قطة تبدأ بحرف 'c' وتستمر وتنتهي عند. تعني [cbr] at ، تطابق 'c' أو 'b' أو 'r' متبوعًا بـ at.

تم العثور على ناتج الكود التالي ، مما يعني حدوث تطابق:

ص='الخفاش دخل الغرفة.'
لو [[ $ شارع= ~[cbr]في]]؛من ثم
رما - طرد - قذفوجدت
يكون

يطابق النمط [cbr] at الخفافيش ، والتي تبدأ بالحرف 'b' وتستمر وتنتهي عند. تعني [cbr] at ، تطابق 'c' أو 'b' أو 'r' متبوعًا بـ at.

تم العثور على ناتج الكود التالي ، مما يعني حدوث تطابق:

ص='جاء الجرذ إلى الغرفة.'
لو [[ $ شارع= ~[cbr]في]]؛من ثم
رما - طرد - قذفوجدت
يكون

يطابق النمط [cbr] at الفئران ، والتي تبدأ بالحرف 'r' وتستمر وتنتهي عند.

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

مجموعة من الشخصيات

في الكود أعلاه [cbr] هي فئة. حتى إذا كان 'c' أو 'b' أو 'r' يتوافق مع حرف واحد ، إذا لم يتطابق التالي على الفور ، فلن يتطابق النمط مع أي شيء.

حسنًا ، هناك نطاقات معينة ستشكل فصلًا دراسيًا. على سبيل المثال ، من 0 إلى 9 أرقام من الفصل ، [0-9] مع 0 و 9 مضمنة. تشكل الأحرف الصغيرة من 'a' إلى 'z' الفئة [a-z] مع تضمين 'a' و 'z'. تشكل الأحرف الكبيرة من 'A' إلى 'Z' الفئة [A-Z] مع تضمين 'A' و 'Z'. من فئة ، هو أحد الأحرف التي تطابق حرفًا واحدًا في السلسلة.

ينتج عن الكود التالي تطابق:

لو [[ 'ID8id'= ~[0-9] ]]؛من ثم
رما - طرد - قذفوجدت
يكون

هذه المرة يكون الهدف عبارة عن سلسلة حرفية في الشرط. 8 ، وهو أحد الأرقام المحتملة داخل النطاق ، [0-9] ، يطابق 8 في السلسلة ، 'ID8id'. الكود أعلاه يعادل:

لو [[ 'ID8id'= ~[0123456789] ]]؛من ثم
رما - طرد - قذفوجدت
يكون

هنا ، تمت كتابة جميع الأرقام الممكنة في النمط ، لذلك لا توجد واصلة.

في الكود التالي يتم الحصول على تطابق:

لو [[ 'ID8iD'= ~[من الألف إلى الياء] ]]؛من ثم
رما - طرد - قذفوجدت
يكون

المطابقة بين الأحرف الصغيرة 'i' من النطاق ، [a-z] ، والحالة الصغيرة 'i' للسلسلة المستهدفة ، 'ID8iD'.

تذكر: النطاق عبارة عن فئة. يمكن أن يكون الفصل جزءًا من نمط أكبر. لذلك في النمط ، يمكن أن يكون النص أمام الفصل و / أو بعده. يوضح الكود التالي هذا:

لو [[ 'ID8id هو المعرف'= ~ المعرف[0-9]هوية شخصية ]]؛من ثم
رما - طرد - قذفوجدت
يكون

الإخراج هو: found. يطابق 'ID8id' من النمط 'ID8id' في السلسلة الهدف.

النفي

لا يتم الحصول على المطابقة من الكود التالي:

لو [[ '0123456789101112'= ~[^0-9] ]]؛من ثم
رما - طرد - قذفوجدت
آخر
رما - طرد - قذفغير موجود
يكون

الخرج هو:

غير موجود

بدون ^ أمام النطاق ، داخل الأقواس المربعة ، سيكون صفر النطاق يطابق الصفر الأول من السلسلة الهدف. لذا ، فإن ^ أمام النطاق (أو الأحرف الاختيارية) ينفي الفئة.

ينتج عن الكود التالي تطابق لأن الشرط يقرأ: تطابق أي حرف غير رقمي في أي مكان في الهدف:

لو [[ 'ABCDEFGHIJ'= ~[^0-9] ]]؛من ثم
رما - طرد - قذفوجدت
آخر
رما - طرد - قذفغير موجود
يكون

إذن الناتج هو: موجود.

[^ 0-9] تعني غير رقم ، لذا فإن [^ 0-9] هو نفي [0-9].

[^ a-z] تعني حرفًا غير صغير ، لذا فإن [^ a-z] هو نفي [a-z].

[^ A-Z] تعني حرفًا غير كبير ، لذا فإن [^ A-Z] هو نفي [A-Z].

تتوفر النفي الأخرى.

الفترة (.) في النموذج

النقطة (.) في النمط تطابق أي حرف بما في ذلك نفسه. ضع في اعتبارك الكود التالي:

لو [[ '6759WXY.A3'= ~ 7.9 واط]]؛من ثم
رما - طرد - قذفوجدت
يكون

تم العثور على ناتج الكود لأن الأحرف الأخرى تتطابق. نقطة واحدة تطابق '5' ؛ نقطة أخرى تطابق 'X' ؛ والنقطة الأخيرة تطابق نقطة.

تناوب المطابقة

ضع في اعتبارك هذه الجملة للسلسلة المستهدفة:

يحتوي القفص على أنواع مختلفة من الطيور.

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

ص='القفص به طاووس من أنواع مختلفة.'
لو [[ $ شارع= ~ حمامة|الطاووس|نسر]]؛من ثم
رما - طرد - قذفوجدت
آخر
رما - طرد - قذفغير موجود
يكون

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

التجمع

في النمط التالي ، تم استخدام الأقواس لتجميع الأحرف:

مرحلة (راقصة)

المجموعة هنا هي راقصة مسرحية محاطة بالأحرف الأولية (و). (الراقصة) هي مجموعة فرعية ، بينما المرحلة (الراقصة) هي المجموعة بأكملها. ضع في اعتبارك ما يلي:

(الراقصة رائعة)

هنا ، المجموعة الفرعية أو السلسلة الفرعية ، الراقصة رائعة.

السلاسل ذات الأجزاء المشتركة

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

موقع الويب Stake.com مخصص للأعمال ؛

هناك أصحاب المصلحة ؛

أصحاب المصلحة يعمل لصالح

دع أيًا من هذه السلاسل يكون الهدف. قد يرغب المبرمج في معرفة ما إذا كان stock.com أو أصحاب المصلحة في أي سلسلة مستهدفة. سيكون نمطه:

stock.com | أصحاب المصلحة

باستخدام التناوب.

تم كتابة الوتد مرتين في الكلمتين. يمكن تجنب ذلك عن طريق كتابة النمط على النحو التالي:

حصة (.com | صاحب)

.com | holder هي المجموعة الفرعية في هذه الحالة.

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

ص='موقع الويب ، Stake.com للأعمال التجارية.'
لو [[ $ شارع= ~ حصة(.مع|مالك) ]]؛من ثم
رما - طرد - قذفوجدت
يكون

السلسلة الفرعية المطابقة هنا هي stock.com.

المصفوفة المحددة مسبقًا BASH_REMATCH

BASH_REMATCH عبارة عن مصفوفة محددة مسبقًا. افترض أن للنمط مجموعات. المجموعة الكاملة المتطابقة ، تذهب إلى الخلية للفهرس 0 من هذه المجموعة. المجموعة الفرعية الأولى المتطابقة تذهب إلى الخلية للفهرس 1 ؛ المجموعة الفرعية الثانية المتطابقة ، تذهب إلى الخلية للفهرس 2 ، وهكذا. يوضح الكود التالي كيفية استخدام هذه المصفوفة:

ص='لقد حان راقصة المسرح.'
لو [[ $ شارع= ~ المرحلة (راقصة) ]]؛من ثم
رما - طرد - قذفوجدت
يكون

لأنافي $ {! BASH_REMATCH [@]}؛فعل
printf '{BASH_REMATCH [i]} دولار،
انتهى
رما - طرد - قذف

الخرج هو:

وجدت
مرحلة راقصة ، راقصة ،

المجموعة كلها راقصة مسرحية. هناك مجموعة فرعية واحدة فقط وهي الراقصة.

ملاحظة: تم إفلات المساحة الموجودة في النموذج.

مطابقة استقلال الأحرف الكبيرة والصغيرة

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

محلات nocasematch

ص='نحن نحب الموسيقى الجيدة.'
لو [[ $ شارع= ~ GoOd]]؛من ثم
رما - طرد - قذفوجدت
يكون

محلات -unocasematch

الإخراج هو: found. النمط هو GoOd. السلسلة الفرعية المطابقة هي 'جيدة'. لاحظ كيف تم تمكين خيار nocasematch في بداية مقطع الرمز وتعطيله في نهاية مقطع الرمز.

طول الخيط

صيغة الحصول على طول السلسلة هي:

$ {# معلمة}

مثال:

ص='نحن نحب الموسيقى الجيدة.'
رما - طرد - قذف $ {# str}

الخرج هو: 19.

تخفيض السلسلة

صيغ تقليل السلسلة هي:

$ {المعلمة: OFFSET}
$ {المعلمة: OFFSET: LENGTH}

حيث يبدأ حساب OFFSET من الصفر.

يوضح المثال التالي كيفية إزالة أول 11 حرفًا من سلسلة:

ص='أنا دائما أرقص على أنغام موسيقى جيدة.'
رما - طرد - قذف $ {str: 10}

الخرج هو:

تعصب على الموسيقى الجيدة.

يبدأ العد لـ LENGTH من الحرف التالي. يوضح الكود التالي كيف يمكن السماح بجزء داخل السلسلة:

ص='أنا دائما أرقص على أنغام موسيقى جيدة.'
رما - طرد - قذف $ {str: 10: 6}

الخرج هو:

تعصب ر

تمت إزالة أول 11 حرفًا ؛ تم السماح بالأحرف الستة التالية ، وتمت إزالة الأحرف المتبقية تلقائيًا.

البحث والاستبدال

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

أين=$ {معلمة / نمط / استبدال}
أين=$ {PARAMETER // PATTERN / REPLACEMENT}
أين=$ {معلمة / نمط}
أين=$ {PARAMETER // PATTERN}

بالنسبة إلى الصيغة الأولى بشرطة مائلة واحدة للأمام ، يتم استبدال المطابقة الأولى فقط. مثال:

ص='هناك فأر وخفاش وقط في الغرفة.'
حق=$ {str / [cbr] في / بقرة كبيرة}
رما - طرد - قذف $ شارع
رما - طرد - قذف $ ret

الخرج هو:

يوجد جرذ وخفاش وقط في الغرفة.
هناك بقرة كبيرة وخفاش وقط في الغرفة.

بالنسبة للصيغة الثانية ذات الشرطات المائلة للأمام ، يتم استبدال جميع تكرارات التطابق. مثال:

ص='هناك فأر وخفاش وقط في الغرفة.'
حق=$ {str // [cbr] في / بقرة كبيرة}
رما - طرد - قذف $ شارع
رما - طرد - قذف $ ret

الخرج هو:

يوجد جرذ وخفاش وقط في الغرفة.
هناك بقرة كبيرة وبقرة كبيرة وبقرة كبيرة في الغرفة.

بالنسبة للصيغة الثالثة بشرطة مائلة واحدة ، لا يوجد بديل للمطابقة الأولى والوحيدة.

يتم أيضًا حذف السلسلة الفرعية الأولى التي تم العثور عليها. مثال:

ص='هناك فأر وخفاش وقط في الغرفة.'
حق=$ {str / [cbr] في}
رما - طرد - قذف $ شارع
رما - طرد - قذف $ ret

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

ص='هناك فأر وخفاش وقط في الغرفة.'
حق=$ {str // [cbr] في}
رما - طرد - قذف $ شارع
رما - طرد - قذف $ ret

الخرج هو:

يوجد جرذ وخفاش وقط في الغرفة.
هناك أ ، و ، و ، في الغرفة.

استنتاج

للتحقق مما إذا كانت السلسلة تحتوي على سلسلة فرعية في Bash ، يجب استخدام Pattern Matching. لا تتم مطابقة النمط في الشرط فقط بين قوسين مزدوجين ، [[. . . ]]. يمكن أن يحدث أيضًا في توسيع المعلمة ، مع $ {. . .}. مع توسيع المعلمة ، من الممكن الحصول على سلسلة فرعية بواسطة الفهارس.

ما تم تقديمه في هذه المقالة هو أهم النقاط في مطابقة الأنماط. هناك أكثر! ومع ذلك ، ما يجب على القارئ دراسته بعد ذلك ، هو توسيع اسم الملف.