כמו רוב השפות האחרות, PowerShell יכול לעבוד עם מחרוזות וטקסט. אחת מהתכונות השימושיות היא היכולת להשתמש ב-PowerShell כדי להחליף תווים, מחרוזות או אפילו טקסט בתוך קבצים.
במדריך זה, תלמד איך להשתמש בשיטת replace()
של PowerShell ובאופרטור replace
של PowerShell. המדריך יכסה את היסודות ויתעמק גם במבני ביטויים רגולריים "כיף"!
לפני שתתחיל
לא תצטרך הרבה כדי להבין את כל הדוגמאות במדריך זה; תצטרך פשוט להשתמש ב-PowerShell. הדוגמאות במדריך זה ישתמשו בגרסה 7.0.2 של PowerShell אך כל הדוגמאות צריכות לעבוד ב-Windows PowerShell.
שימוש ב-PowerShell להחלפת מחרוזות: היסודות
אחד מהמקרים הפשוטים ביותר של שימוש ב-PowerShell replace הוא להחליף תווים בתוך מחרוזות. בואו נתחיל עם כמה דוגמאות.
נניח שיש לך מחרוזת ב-PowerShell עם ערך של שלום, עולם
.
תרצה להחליף את המחרוזת שלום
, בתוך המחרוזת הזו, במחרוזת הי
כך שהמשתנה $מחרוזת
יכיל ערך של הי, עולם
. כדי לעשות זאת, PowerShell צריך תחילה לגלות איפה הטקסט "למצוא". לאחר שנמצא, הוא מחליף את הטקסט הזה בערך שהמשתמש הגדיר.
שימוש בשיטת Replace()
אחת מהדרכים הקלות ביותר להחליף מחרוזות בפוורשל היא באמצעות הפעלת שיטת ההחלפה כפי שמוצג למטה. שיטת replace()
מקבלת שני ארגומנטים: המחרוזת לחיפוש והמחרוזת להחלפה בטקסט שנמצא.
כפי שניתן לראות למטה, PowerShell מחפש את המחרוזת hello
ומחליף את המחרוזת הזו במחרוזת hi
. השיטה מחזירה אז את התוצאה הסופית, שהיא hi, world
.
ניתן לקרוא לשיטת ההחלפה של PowerShell על כל מחרוזת כדי להחליף מחרוזת ליתרה. אם המחרוזת שיש להחליף אינה נמצאת, השיטה replace()
אינה מחזירה דבר.
אין צורך להקצות מחרוזת למשתנה כדי להחליף טקסט במחרוזת. במקום זאת, ניתן לקרוא לשיטת
replace()
ישירות על המחרוזת, כמו כן:'hello world'.replace('hello','hi')
. המדריך משתמש במשתנה לנוחות.
הסרת תווים
ייתכן ותרצה להסיר תווים ממחרוזת יותר מאשר להחליף אותם בתווים אחרים. זה אפשרי גם על ידי ציון מחרוזת ריקה.
החלפת מספר הופעות
עכשיו יש לך את הקוד להחלפת מחרוזת בתוך מחרוזת נוספת. מה בנוגע להחלפת מספר של מחרוזות? אין בעיה.
מכיוון ששיטת ההחלפה של PowerShell מחזירה מחרוזת, כדי להחליף עוד הופעה, ניתן להוסיף קריאה נוספת לשיטת replace()
לסיום הקוד המקורי.
באפשרותך לרכז יחד כמה שיחות של
replace()
בהתאם לצורך, אך כדאי לך לבדוק אפשרות שימוש באופרטורreplace
אם יש לך הרבה מחרוזות להחליף.
שימוש באופרטור ההחלפה של PowerShell
אם כי שימוש בשיטת המחרוזת להחלפה של PowerShell הוא הדרך הפשוטה ביותר להחלפת טקסט, תוכל גם להשתמש באופרטור replace
של PowerShell. האופרטור replace
דומה לשיטה באופן שאתה מספק מחרוזת למציאת והחלפה. אך יש לו יתרון גדול אחד; היכולת להשתמש בביטויים רגולריים (regex) כדי למצוא מחרוזות תואמות (יותר מאוחר).
על פי הדוגמה לעיל, אתה יכול להשתמש באופרטור replace
כדי להחליף hello
ב־hi
בדרך דומה כמו שמוצג למטה. PowerShell מבצע את אותם השלבים.
הסרת תווים
כמו בשיטת ההחלפה של PowerShell, תוכל גם להסיר תווים ממחרוזת באמצעות האופרטור replace
. אך, בניגוד לשיטת replace()
, תוכל גם לא לכלול את המחרוזת לגמרי כארגומנט להחלפה ותגלה את אותו האפקט.
החלפת מספר מופעים
כמו בשיטת replace()
, תוכל גם לרכז יחד שימושים של אופרטור replace
. מאחר והאופרטור replace
מחזיר מחרוזת כפי שמוצג למטה, תראה בקטע הבא, הקוד שלך יהיה נקי יותר בשימוש ב־regex.
שימוש ב־PowerShell Regex Replace
כפי שצוין לעיל, החלפת מחרוזות בשיטת 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. שפת הביטויים הרגילים (regular expression) משתמשת בכמה תווים שאינם מתורגמים למילים פשוטות כמו רוב האותיות והמספרים.
לדוגמה, ייתכן ותרצה להחליף טקסט במחרוזת. המחרוזת מכילה כמה תווים מיוחדים של regex כמו סוגרים מרובעים וסימן שאלה. לאחר מכן תנסה להחליף את המחרוזת [hello]
במחרוזת goodbye
כפי שמוצג למטה.
ברור שזה לא מה שרצית. התרחשת המצב הזה כאשר אתה משתמש בתווים מיוחדים של regex בתוך המחרוזת לחיפוש ([hello]
).
על מנת למנוע את הבעיה הזו, יש לך שני אפשרויות. באפשרות הראשונה, אתה יכול לברוח מתווים אלה על ידי הוספת קו נטוי לפני כל תו. או שתשתמש ב-שיטת Escape()
.
להלן ניתן לראות את ההשפעה של הברחה מכל תו מיוחד עם קו נטוי.
באופן חלופי, ומומלץ, תוכל להשתמש בשיטת Escape()
של סוג ה-regex על מנת להסיר אוטומטית את כל התווים המיוחדים.
יש להשתמש בשיטת
Escape()
ככל האפשר כי היא תברות את כל התווים המיוחדים כדי שלא תצטרך לזכור אותם.
שימוש בקבוצות Match/Capture
בכל אחד מהדוגמאות הקודמות, המדריך הזה השתמש במחרוזת ממש להחלפת מחרוזת אחרת. עד כה, השתמשת ב־hi
או goodbye
. אבל מה קורה אם תרצה להשתמש בתו או תווים נוספים שנמצאים במחרוזת כדי להחליף עם? תצטרך להתאים או להשתמש ב־קבוצות תפיסה.
ברגולריות יש רעיון הקבוצות לתפיסה והתייחסויות חזרה. קבוצות התפיסה מאפשרות לך ל־לתפוס מחרוזות ולהתייחס אליהן במקומות אחרים. PowerShell משתמשת בתכונות האלו בעזרת קבוצות התאמה עם אופרטור ה־replace
.
לדוגמה, אולי יש לך מחרוזת שעשויה להכיל ערכים שונים.
תרצה להחליף את חלק הראשון של המחרוזת עם חלק השני כך שיראו כך:
כדי לבצע פעולה זו, PowerShell צריך למצוא את כל הטקסט מימין ומשמאל לסימן פסיק. כשהוא יודע מהו הטקסט הזה, הוא צריך להחליף את אחד מהם בשני. כדי לעשות את זה, אתה צריך תיחזוקי חזרה.
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.
אתה יכול לראות דוגמה למטה.
בדוגמה למעלה, אתה יכול לראות קבוצות תפיסה שמאפסות כל התאמה (שלום עולם
) ו- (אתה חיה מפנקת
) בעזרת סוגריים. לאחר מכן, להחלפה, שלום עולם
נמצא תחילה משמאל לימין ולכן מקבל תווית אספקה חזרה $1
ו- אתה חיה מפנקת
מקבלת תווית אספקה חזרה $2
.
כאשר PowerShell מכיר בערך של כל ההתאמה, אתה יכול להשתמש בהפניות אלו בטקסט המוחלף בכל דרך שתרצה. בדוגמה זו $2,$1
מחליפה את מקומם.
שימוש בקבוצות התאמה בשמות
אם אינך רוצה להשתמש במקומות מספר כמו $1
, $2
כדי להתייחס לערכי ההתאמה, אפשר גם להשתמש בתוויות או בשמות. במקום להיות צריך לספור משמאל לימין איזה הפניות מהווות מה, אפשר פשוט להשתמש בשמות.
כדי להשתמש בשמות כהפניות, עליך תחילה להגדיר תוויות עבור כל התאמה במחרוזת ההתאמה. כדי לעשות זאת, עליך להגדיר את קבוצת התפיסה כמו (?<label><regex>)
שבו label
הוא השם ו- <regex>
הוא הביטוי הרגיל שאתה משתמש בו.
כשהגדרת את השמות, תוכל להתייחס אליהם במחרוזת ההחלפה באמצעות סימן דולר ובאותו הזמן לארוז את השם בסוגריים מתוחכמים למשל. ${label}
.
אתה יכול לראות הדגמה לטכניקה זו למטה.
מסקנה
כפי שלמדת, אופרטור ההחלפה של PowerShell מאפשר לך להחליף תווים, טקסט ומחרוזות בדרכים רבות. כדי לבצע החלפות פשוטות, תוכל להשתמש במתודת replace()
, אך אם תצטרך להתאים ולהחליף דברים מורכבים יותר, תשתמש תמיד באופרטור replace
.