يدرك كل من تعامل مع متغيرات باش عدم وجود أي فرق بين تعريف متغير نوعه عدد صحيح int ومتغير نوعه سلسلة نصية string، فمهما كان نوع البيانات المتغير في باش هو متغير فقط.
وقد تعرفنا في مقالنا السابق على معاملات العمليات الحسابية للتعامل مع الأعداد، وسنتعرف في هذا المقال على وظائف باش الخاصة بالتعامل مع السلاسل النصية، مثل حساب طول سلسلة نصية، وربط السلاسل النصية ببعضها، واستخراج السلاسل النصية الفرعية منها، واستبدال السلاسل النصية الفرعية وغير ذلك.
معرفة طول السلسلة النصية
السلسلة النصية string هي مجموعة أو مصفوفة من المحارف المتسلسلة فيما بينها. لنُعرّف سلسلة نصية جديدة أو متغير جديد في باش باسم distro مثلًا ونعطيه القيمة "Ubuntu" نكتب التالي:
distro="Ubuntu"
يمكن الحصول على طول هذه السلسلة أي عدد محارفها بكتابة الرمز #
قبل اسمها ضمن تعليمة echo
كما يلي:
kabary@handbook:~/scripts$ echo ${#distro} 6
تنحصر وظيفة الأمر echo
بإظهار النتيجة، أما الصيغة {string#}
فهي التي احتسبت طول السلسلة الفعلي.
دمج السلاسل النصية
نعني بدمج السلاسل concatenation إلحاق سلسلة نصية أولى بنهاية سلسلة نصية أخرى للحصول على سلسلة أطول.
لننشئ على سبيل المثال السلسلتين النصيتين "str1" و "str2" كما يلي:
str1="hand" str2="book"
لندمج الآن السلسلتين معًا ونخزن النتيجة بسلسلة ثالثة:
str3=$str1$str2
توضح الصورة التالية النتيجة:
إيجاد السلاسل النصية الفرعية
تساعدنا هذه العملية على فهرسة index أو إيجاد موضع محرف معين أو تسلسل محارف معين ضمن سلسلة نصية، لتوضيح الفكرة لننشئ السلسلة النصية "str" كالتالي:
str="Bash is Cool"
يمكننا الآن معرفة موضع السلسلة الفرعية "Cool" ضمن الجملة السابقة باستخدام الأمر expr
، وفق التالي:
kabary@handbook:~/scripts$ word="Cool" kabary@handbook:~/scripts$ expr index "$str" "$word" 9
بعد تنفيذ الأمر حصلنا على العدد 9 في النتيجة، وهو يشير إلى ترتيب أول محرف من محارف السلسلة الفرعية "Cool" ضمن السلسلة الأصلية "Bash is Cool"، أي أنه مثل فهرس index لموضع السلسلة الفرعية.
ملاحظة: لم نستخدم الجملة الشرطية if
في الأمثلة التي أوردناها في هذا المقال لأننا سنخصص لها مقالًا لاحقًا.
استخراج السلاسل النصية الفرعية
يعني استخراج سلسلة فرعية من سلسلة أخرى استخراج حرف أو كلمة أو مجموعة كلمات من سلسلة نصية معينة.
سنكتب الأمر التالي لإنشاء سلسلة نصية جديدة اسمها "foss" كما يلي:
foss="Fedora is a free operating system"
لنفترض الآن أننا نرغب باستخراج السلسلة الفرعية "fedora" من السلسلة السابقة، فكيف سننجز ذلك؟ ما نحتاجه هو فهرس السلسلة الفرعية أو موضع أول محرف فيها، بالإضافة إلى طولها الذي يُمثّل عدد المحارف التي نريد استخراجها.
إذًا كي نستخرج السلسلة "fedora" سنبدأ من المحرف الذي ترتيبه 0، وسنستخرج بعده 6 محارف، وفق التالي:
kabary@handbook:~/scripts$ echo ${foss:0:6} Fedora
نلاحظ أن ترتيب المحارف في سلاسل باش النصية يبدأ من الصفر وليس من الواحد، وهذا ينسجم مع ترتيب أول عنصر في مصفوفات باش التي تبدأ دائمًا بالصفر. يمكننا أيضًا تحديد موضع البداية فقط وعدم ذكر عدد المحارف المطلوب استخراجها وعندها سيستخرج باش جميع المحارف من موضع البداية وحتى نهاية السلسلة.
على سبيل المثال إذا أردنا استخراج السلسلة الفرعية "free operating system" من السلسلة "foss" السابقة، فسنحدد فقط موضع البداية وهو في حالتنا 12 كما يلي:
kabary@handbook:~/scripts$ echo ${foss:12} free operating system
استبدال السلاسل النصية الفرعية
تتيح لنا هذه العملية استبدال سلسلة نصية فرعية بسلسلة أخرى، فيمكننا على سبيل المثال استبدال السلسلة النصية الفرعية "fedora" بالسلسلة النصية الفرعية "Ubuntu" ضمن السلسلة "foss" السابقة، وذلك وفق التالي:
kabary@handbook:~/scripts$ echo ${foss/Fedora/Ubuntu} Ubuntu is a free operating system
لنجرب استبدالًا آخر وهو تبديل السلسلة "free" بالسلسلة "popular" مثلًا:
kabary@handbook:~/scripts$ echo ${foss/free/popular} Fedora is a popular operating system
تجدر الإشارة هنا لأننا أجرينا في كلا المثالين السابقين استبدالًا ظاهريًا للسلاسل النصية الفرعية أي عند عرض السلاسل فقط من خلال الأمر echo
، حيث أظهرنا السلسلة مرة باستبدال "fedora" ومرة "free" لكننا لم نبدل القيمة الفعلية للسلسلة "foss" حيث بقيت القيمة المخزنة فيها كما هي.
حذف السلاسل النصية الفرعية
يمكننا حذف أي سلسلة نصية فرعية من أي سلسلة نريدها باستخدام /
، لننشئ مثلًا السلسلة النصية "fact" التالية:
fact="Sun is a big star"
لنحذف منها السلسلة الفرعية "big":
kabary@handbook:~/scripts$ echo ${fact/big} Sun is a star
لننشئ سلسلة أخرى مختلفة قليلًا اسمها "cell":
cell="112-358-1321"
لنفترض أننا نريد حذف الشرطات "-" منها، فإذا كتبنا الأمر التالي فإنه سيحذف الشرطة الأولى فقط كما يلي:
kabary@handbook:~/scripts$ echo ${cell/-} 112358-1321
أما لحذف جميع الشرطات الموجودة في السلسلة فينبغي كتابة الرمز /
مرتين، وفق التالي:
kabary@handbook:~/scripts$ echo ${cell//-} 1123581321
نلاحظ أننا نحذف السلاسل النصية الفرعية في خرج الأمر echo
فقط ولم نحذفها من القيمة الأصلية للسلسلة النصية "cell" التي بقيت كما هي ولم تتأثر بالحذف.
أما إذا رغبنا بتعديل القيمة الأصلية للسلسلة النصية، وحذف الشرطات منها فعليًّا، فهذه هي الطريقة:
kabary@handbook:~/scripts$ echo $cell 112-358-1321 kabary@handbook:~/scripts$ cell=${cell//-} kabary@handbook:~/scripts$ echo $cell 1123581321
تغيير حالة الحروف بين كبيرة وصغيرة في السلاسل النصية
يتيح لنا باش تغيير حالة الحروف الأبجدية في السلاسل النصية من كبيرة إلى صغيرة أو بالعكس بسهولة. لننشئ في البداية سلسلتين نصيتين كما يلي:
legend="john nash" actor="JULIA ROBERTS"
لنحوّل حالة الحروف في السلسلة النصية الأولى "legend" من حروف صغيرة إلى حروف كبيرة، وفق التالي:
kabary@handbook:~/scripts$ echo ${legend^^} JOHN NASH
ولنحول أيضًا حروف السلسلة النصية "actor" إلى حروف صغيرة:
kabary@handbook:~/scripts$ echo ${actor,,} julia roberts
نستطيع أيضًا تحويل حالة الحرف الأول فقط في "legend" إلى حرف كبير:
kabary@handbook:~/scripts$ echo ${legend^} John nash
والحرف الأول فقط في "actor" إلى حرف صغير:
kabary@handbook:~/scripts$ echo ${actor,} jULIA ROBERTS
يمكننا أيضًا تحويل حالة حروف بعينها فقط من حروف كبيرة إلى صغيرة أو العكس؛ فعلى سبيل المثال يمكن تغيير الحرفين j
و n
من السلسلة النصية "legend" إلى حروف كبيرة كما يلي:
kabary@handbook:~/scripts$ echo ${legend^^[jn]} JohN Nash
الخلاصة
بهذا نكون قد وصلنا إلى ختام المقال الذي شرحنا فيه كيفية التعامل مع السلاسل النصية في سكربتات باش، وفي المقال القادم سنتطرق لشرح مهارات جديدة ونوضح طريقة اتخاذ القرار ضمن سكربتات باش باستخدام الجمل الشرطية.
ترجمة -وبتصرف- للمقال String Operations in Bash.
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.