مثل العديد من اللغات الأخرى، يمكن لـ PowerShell التعامل مع السلاسل والنصوص. إحدى تلك الميزات المفيدة هي استخدام PowerShell لاستبدال الأحرف أو السلاسل أو حتى النصوص داخل الملفات.
في هذا البرنامج التعليمي، ستتعلم كيفية استخدام طريقة replace()
في PowerShell وعامل replace
في PowerShell. سيشمل البرنامج التعليمي الأساسيات وحتى يمكن أن يتعمق في بعض التعابير العادية “الممتعة”!
قبل أن تبدأ
لن تحتاج إلى الكثير لمتابعة جميع الأمثلة في هذا البرنامج التعليمي؛ ستحتاج فقط إلى PowerShell. ستستخدم أمثلة هذا البرنامج التعليمي PowerShell v7.0.2 ولكن يجب أن تعمل جميع الأمثلة يجب أن تعمل في Windows PowerShell.
استخدام PowerShell لاستبدال السلاسل: الأساسيات
أحد أبسط الحالات في استخدام PowerShell للاستبدال هو استبدال الأحرف في السلاسل. دعونا نبدأ هنا مع بعض الأمثلة.
لنفترض أن لديك سلسلة في PowerShell بقيمة hello, world
.
ترغب في استبدال السلسلة hello
داخل تلك السلسلة بالسلسلة hi
لتجعل المتغير $string
يحمل قيمة hi, world
. للقيام بذلك، يحتاج PowerShell أولاً إلى معرفة مكان “العثور” على النص. بمجرد العثور عليه، يقوم بتبديل هذا النص بقيمة تم تعريفها من قبل المستخدم.
باستخدام طريقة Replace()
واحدة من أسهل الطرق لاستبدال السلاسل في قوة الأداة النصية كما هو موضح أدناه. طريقة replace()
لديها وسيطين ؛ السلسلة المطلوب العثور عليها والسلسلة المطلوب استبدال النص الموجود بها.
كما يمكنك رؤية أدناه ، قوة الأداة النصية هي تجد السلسلة hello
و تستبدل تلك السلسلة بالسلسلة hi
. ثم يعيد الأداة النصية النتيجة النهائية وهي hi, world
.
يمكنك استدعاء طريقة استبدال قوة الأداة النصية على أي سلسلة لاستبدال أي سلسلة حرفية بأخرى. إذا لم يتم العثور على السلسلة المراد استبدالها ، فإن طريقة replace()
تعيد شيئًا.
لا تحتاج إلى تعيين سلسلة لمتغير لاستبدال النص في سلسلة. بدلاً من ذلك ، يمكنك استدعاء طريقة
replace()
مباشرة على السلسلة مثل:'hello world'.replace('hello','hi')
. يستخدم البرنامج التعليمي متغيرًا للراحة.
إزالة الأحرف
ربما ترغب في إزالة الأحرف في سلسلة من سلسلة أخرى بدلاً من استبدالها بشيء آخر. يمكنك أيضًا القيام بذلك عن طريق تحديد سلسلة فارغة.
استبدال عدة حالات
لديك الآن الكود لاستبدال سلسلة داخل سلسلة أخرى. ماذا عن استبدال عدة سلاسل؟ ليس هناك مشكلة.
نظرًا لأن طريقة استبدال قوة الأداة النصية تعيد سلسلة ، لاستبدال حالة أخرى ، يمكنك إلحاق مكالمة طريقة replace()
أخرى في النهاية. يقوم برنامج قوة الأداة النصية بتنفيذ طريقة replace()
على الإخراج الأصلي.
يمكنك ربط العديد من استدعاءات طريقة
replace()
معًا حسب الحاجة ولكن يجب عليك أن تنظر في استخدام مشغلreplace
إذا كان لديك العديد من السلاسل للاستبدال.
استخدام مشغل استبدال PowerShell
على الرغم من أن استخدام طريقة استبدال سلسلة PowerShell هو أبسط طريقة لاستبدال النص، يمكنك أيضًا استخدام مشغل replace
في PowerShell. المشغل replace
مماثل للطريقة بحيث تقدم سلسلة للبحث عنها واستبدالها. ولكن، له ميزة كبيرة؛ القدرة على استخدام التعابير العادية للعثور على سلاسل مطابقة (المزيد لاحقًا).
باستخدام المثال أعلاه، يمكنك استخدام مشغل replace
لاستبدال hello
بـ hi
بنفس الطريقة كما هو موضح أدناه. يقوم PowerShell بتنفيذ نفس الخطوات.
إزالة الأحرف
مثل طريقة استبدال PowerShell، يمكنك أيضًا إزالة الأحرف من سلسلة باستخدام مشغل replace
. ولكن، على عكس طريقة replace()
، يمكنك أيضًا استبعاد السلسلة تمامًا كوسيطة للاستبدال بها وستجد نفس التأثير.
استبدال العديد من الحالات
مثل طريقة replace()
، يمكنك أيضًا ربط استخدامات مشغل replace
معًا. نظرًا لأن مشغل replace
يعيد سلسلة كما هو موضح أدناه. سترى في القسم التالي، سيكون كودك أنظف باستخدام regex.
استخدام PowerShell Regex Replace
كما هو مذكور أعلاه، يعمل استبدال السلاسل في طريقة استبدال PowerShell ولكن بشكل محدود. أنت مقيد باستخدام سلاسل حرفية فقط. لا يمكنك استخدام الرموز البارزة أو regex. إذا كنت تقوم بأي نوع من أنواع الاستبدال الوسيط أو المتقدم، يجب عليك استخدام replace
العامل.
لنفترض أن لديك سكريبت يحتوي على سلسلة تم إنشاؤها باستخدام متغير. يجب أن تكون هذه السلسلة إما hello، world
أو hi، world.
. ربما كنت قد قضيت يومًا سيئًا كمسؤول نظام وتريد تغيير السلسلة، بغض النظر عن القيمة، إلى goodbye، world
.
تحتاج إلى تحويل hello، world
و hi، world
إلى goodbye، world
. لتحقيق هذا، تحتاج إلى استخدام تعبير منتظم. يمكنك مطابقة أي نمط محدد تقريبًا في النص باستخدام regex.
في هذا المثال، يمكنك استخدام التعبير hello|hi
لمطابقة كلتا السلاسل المطلوبة باستخدام regex حرف “أو” (|
) كما يمكنك رؤيته أدناه.
بمجرد أن تتعلم كيفية استخدام regex للعثور على السلاسل، يمكنك استخدام PowerShell لاستبدال سلاسل الرموز البارزة التي تتناسب مع أي نمط.
تهريب أحرف Regex
في المثال الذي بيننا أعلاه، السلسلة التي تم البحث فيها لم تحتوي على أي من الرموز الخاصة بتعبيرات الـ regex. لغة التعبير العادي لديها بعض الرموز التي لا تتم تفسيرها حرفيًا مثل معظم الحروف والأرقام.
على سبيل المثال، قد تحتاج إلى استبدال نص في سلسلة. تحتوي تلك السلسلة على بعض الرموز الخاصة بتعبيرات الـ regex مثل قوس وعلامة اسئلة. بعد ذلك تحاول استبدال السلسلة [hello]
بـ goodbye
كما هو موضح أدناه.
هذا بالتأكيد ليس ما كنت تنوي. هذه الحالة تحدث عندما تستخدم رموز خاصة بتعبيرات الـ regex داخل السلسلة للبحث عنها ([hello]
).
لتجنب هذه المشكلة، لديك خياران. يمكنك إما تهيئة هذه الرموز الخاصة عن طريق إضافة شرطة عكسية إلى الأمام من كل حرف، أو استخدام Escape()
الأسلوب.
فيما يلي يمكنك رؤية تأثير تهيئة كل حرف خاص بشرطة عكسية.
بالإضافة إلى ذلك، والأمر الموصى به، يمكنك استخدام Escape()
الأسلوب لنوع الـ regex لإزالة جميع الرموز الخاصة تلقائيًا.
يجب عليك استخدام
Escape()
الأسلوب حيثما كان ذلك ممكنًا لأنه سيقوم بتهيئة جميع الرموز الخاصة بحيث لا تحتاج إلى تذكرها.
استخدام المجموعات المطابقة/التقاط البيانات
في جميع الأمثلة السابقة، كان هذا البرنامج التعليمي يستخدم سلسلة نصية لاستبدال سلسلة أخرى. لقد استخدمت hi
أو goodbye
. ولكن ماذا لو أردت استخدام حرف واحد أو أكثر يتم العثور عليها في سلسلة النص للاستبدال بها؟ ستحتاج إلى التطابق أو تجميع المجموعات.
لديها مفهوم يُسمى المجموعات اللتقاط والإشارات الخلفية. تسمح المجموعات اللتقاط بالتقاط السلاسل لمن ثم الإشارة إليها في أماكن أخرى. تستفيد باور شيل من هذه الميزة عن طريق استخدام مجموعات التطابق مع عامل الاستبدال replace
.
على سبيل المثال، ربما لديك سلسلة نصية قد تحتوي على قيم مختلفة قليلاً.
ترغب في استبدال الجزء الأول من السلسلة بالجزء الثاني لتبدو كما يلي:
للقيام بهذا الإجراء، يجب على باور شيل أن يجد كل النص على اليمين واليسار من الفاصلة. بمجرد معرفته ما هو هذا النص، يجب عليه بعد ذلك استبدال أحدهما بالآخر. للقيام بذلك، ستحتاج إلى الإشارات الخلفية.
A backreference is a regex variable (not a PowerShell variable) that represents the text that regex matched. Backreferences in PowerShell are represented with a dollar sign followed by a number indicating the order in which they were matched.
يمكنك رؤية مثال أدناه.
في المثال أعلاه، يمكنك رؤية مجموعات الالتقاط regex تحيط بكل تطابق (hello world
) و (you sexy beast
) بالأقواس. ثم، للبديل، تم مطابقة hello word
أولاً من اليسار إلى اليمين لذا حصلت على تسمية إشارة إلى الخلف $1
و you sexy beast
حصلت على تسمية إشارة إلى الخلف $2
.
بمجرد أن يعرف PowerShell قيمة كل تطابق، يمكنك استخدام هذه المراجع في النص الذي تم استبداله بأي طريقة ترغب. في هذا المثال، $2,$1
يقوم بتبديل مواقعهما.
استخدام مجموعات تطابق مسماة
إذا كنت لا ترغب في استخدام مؤشرات الرقم مثل $1
، $2
للإشارة إلى قيم التطابق، يمكنك استخدام تسميات أو أسماء أيضًا. بدلاً من الحاجة إلى عد من اليسار إلى اليمين لمعرفة ماذا تعني هذه المراجع، يمكنك ببساطة استخدام الأسماء.
لاستخدام الأسماء كمراجع، تحتاج أولاً إلى تعريف تسميات لكل تطابق في سلسلة التطابق. للقيام بذلك، يجب عليك تحديد مجموعة الالتقاط مثل (?<label><regex>)
حيث label
هو الاسم و <regex>
هو التعبير العادي الذي تستخدمه.
بمجرد أن تحدد الأسماء، يمكنك بعد ذلك الإشارة إليها في سلسلة الاستبدال باستخدام علامة الدولار وتحيط الاسم بالأقواس المنحنية على سبيل المثال ${label}
.
يمكنك رؤية استعراض لهذه التقنية أدناه.
الاستنتاج
كما تعلمت، يسمح لك مشغل الاستبدال في PowerShell بتبديل الأحرف والنصوص والسلاسل بطرق متعددة. لتنفيذ التبديلات البسيطة، يمكنك استخدام طريقة replace()
ولكن إذا كنت بحاجة إلى مطابقة واستبدال أي شيء أكثر تقدمًا، فاستخدم دائمًا مشغل replace
.