איך להשתמש ב-PowerShell Replace להחליף טקסט [דוגמאות]

כמו רוב השפות האחרות, PowerShell יכול לעבוד עם מחרוזות וטקסט. אחת מהתכונות השימושיות היא היכולת להשתמש ב-PowerShell כדי להחליף תווים, מחרוזות או אפילו טקסט בתוך קבצים.

במדריך זה, תלמד איך להשתמש בשיטת replace() של PowerShell ובאופרטור replace של PowerShell. המדריך יכסה את היסודות ויתעמק גם במבני ביטויים רגולריים "כיף"!

לפני שתתחיל

לא תצטרך הרבה כדי להבין את כל הדוגמאות במדריך זה; תצטרך פשוט להשתמש ב-PowerShell. הדוגמאות במדריך זה ישתמשו בגרסה 7.0.2 של PowerShell אך כל הדוגמאות צריכות לעבוד ב-Windows PowerShell.

שימוש ב-PowerShell להחלפת מחרוזות: היסודות

אחד מהמקרים הפשוטים ביותר של שימוש ב-PowerShell replace הוא להחליף תווים בתוך מחרוזות. בואו נתחיל עם כמה דוגמאות.

נניח שיש לך מחרוזת ב-PowerShell עם ערך של שלום, עולם.

$string = 'hello, world'

תרצה להחליף את המחרוזת שלום, בתוך המחרוזת הזו, במחרוזת הי כך שהמשתנה $מחרוזת יכיל ערך של הי, עולם. כדי לעשות זאת, PowerShell צריך תחילה לגלות איפה הטקסט "למצוא". לאחר שנמצא, הוא מחליף את הטקסט הזה בערך שהמשתמש הגדיר.

שימוש בשיטת Replace()

אחת מהדרכים הקלות ביותר להחליף מחרוזות בפוורשל היא באמצעות הפעלת שיטת ההחלפה כפי שמוצג למטה. שיטת replace() מקבלת שני ארגומנטים: המחרוזת לחיפוש והמחרוזת להחלפה בטקסט שנמצא.

כפי שניתן לראות למטה, PowerShell מחפש את המחרוזת hello ומחליף את המחרוזת הזו במחרוזת hi. השיטה מחזירה אז את התוצאה הסופית, שהיא hi, world.

PS> $string.replace('hello','hi')
hi, world

ניתן לקרוא לשיטת ההחלפה של PowerShell על כל מחרוזת כדי להחליף מחרוזת ליתרה. אם המחרוזת שיש להחליף אינה נמצאת, השיטה replace() אינה מחזירה דבר.

אין צורך להקצות מחרוזת למשתנה כדי להחליף טקסט במחרוזת. במקום זאת, ניתן לקרוא לשיטת replace() ישירות על המחרוזת, כמו כן: 'hello world'.replace('hello','hi'). המדריך משתמש במשתנה לנוחות.

הסרת תווים

ייתכן ותרצה להסיר תווים ממחרוזת יותר מאשר להחליף אותם בתווים אחרים. זה אפשרי גם על ידי ציון מחרוזת ריקה.

PS> $string.replace('hello','')
, world

החלפת מספר הופעות

עכשיו יש לך את הקוד להחלפת מחרוזת בתוך מחרוזת נוספת. מה בנוגע להחלפת מספר של מחרוזות? אין בעיה.

מכיוון ששיטת ההחלפה של PowerShell מחזירה מחרוזת, כדי להחליף עוד הופעה, ניתן להוסיף קריאה נוספת לשיטת replace() לסיום הקוד המקורי.

PS> $string.replace('hello','').replace('world','earth')
, earth

באפשרותך לרכז יחד כמה שיחות של replace() בהתאם לצורך, אך כדאי לך לבדוק אפשרות שימוש באופרטור replace אם יש לך הרבה מחרוזות להחליף.

שימוש באופרטור ההחלפה של PowerShell

אם כי שימוש בשיטת המחרוזת להחלפה של PowerShell הוא הדרך הפשוטה ביותר להחלפת טקסט, תוכל גם להשתמש באופרטור replace של PowerShell. האופרטור replace דומה לשיטה באופן שאתה מספק מחרוזת למציאת והחלפה. אך יש לו יתרון גדול אחד; היכולת להשתמש בביטויים רגולריים (regex) כדי למצוא מחרוזות תואמות (יותר מאוחר).

על פי הדוגמה לעיל, אתה יכול להשתמש באופרטור replace כדי להחליף hello ב־hi בדרך דומה כמו שמוצג למטה. PowerShell מבצע את אותם השלבים.

PS> $string -replace 'hello','hi'
hi, world

הסרת תווים

כמו בשיטת ההחלפה של PowerShell, תוכל גם להסיר תווים ממחרוזת באמצעות האופרטור replace. אך, בניגוד לשיטת replace(), תוכל גם לא לכלול את המחרוזת לגמרי כארגומנט להחלפה ותגלה את אותו האפקט.

PS> $string -replace 'hello',''
, world
PS> $string -replace 'hello'
, world

החלפת מספר מופעים

כמו בשיטת replace(), תוכל גם לרכז יחד שימושים של אופרטור replace. מאחר והאופרטור replace מחזיר מחרוזת כפי שמוצג למטה, תראה בקטע הבא, הקוד שלך יהיה נקי יותר בשימוש ב־regex.

PS> $string -replace 'hello','hi' -replace 'world','earth'
hi, earth

שימוש ב־PowerShell Regex Replace

כפי שצוין לעיל, החלפת מחרוזות בשיטת replace של PowerShell עובדת אך היא מוגבלת. אתה מוגבל לשימוש רק במחרוזות ממולאות. אתה לא יכול להשתמש בכרטיסיות או ב־regex. אם אתה בוצע כל סוג של החלפה ביניים או מתקדם, אתה צריך להשתמש באופרטור replace.

נניח שיש לך סקריפט שמכיל מחרוזת שנוצרת עם משתנה. המחרוזת צריכה להיות או hello, world או hi, world. אולי היית לך יום רע כמנהל מערכות ורוצה לשנות את המחרוזת, בלתי תלוי בערך, ל־goodbye, world.

אתה צריך שhello, world ו־hi, world יומרו שניהם ל־goodbye, world. כדי להשיג זאת, עליך להשתמש בביטוי רגולרי. אתה יכול להתאים לכמעט כל דפוס מסוים בטקסט עם regex.

בדוגמה זו, ניתן להשתמש בביטוי hello|hi כדי להתאים לשני המחרוזות הנדרשות באמצעות ה־regex תו "או" (|) כפי שניתן לראות למטה.

PS> 'hello, world' -replace 'hello|hi','goodbye'
goodbye, world
PS> 'hi, world' -replace 'hello|hi','goodbye'   
goodbye, world

פעם שאתה למד איך להשתמש ב־regex כדי למצוא מחרוזות, אתה יכול להשתמש ב־PowerShell להחלפת מחרוזות מכרטיסיות שמתאימות לכל דפוס.

חרוזי Regex נמלטים

בדוגמת ה-regex שניתנה לעיל, מחרוזת המחפשת לא הכילה שום תווים מיוחדים של regex. שפת הביטויים הרגילים (regular expression) משתמשת בכמה תווים שאינם מתורגמים למילים פשוטות כמו רוב האותיות והמספרים.

לדוגמה, ייתכן ותרצה להחליף טקסט במחרוזת. המחרוזת מכילה כמה תווים מיוחדים של regex כמו סוגרים מרובעים וסימן שאלה. לאחר מכן תנסה להחליף את המחרוזת [hello] במחרוזת goodbye כפי שמוצג למטה.

PS> '[hello], world' -replace '[hello]','goodbye'
[goodbyegoodbyegoodbyegoodbyegoodbye], wgoodbyergoodbyed

ברור שזה לא מה שרצית. התרחשת המצב הזה כאשר אתה משתמש בתווים מיוחדים של regex בתוך המחרוזת לחיפוש ([hello]).

על מנת למנוע את הבעיה הזו, יש לך שני אפשרויות. באפשרות הראשונה, אתה יכול לברוח מתווים אלה על ידי הוספת קו נטוי לפני כל תו. או שתשתמש ב-שיטת Escape().

להלן ניתן לראות את ההשפעה של הברחה מכל תו מיוחד עם קו נטוי.

PS> '[hello], world' -replace '\[hello\]','goodbye'
goodbye, world

באופן חלופי, ומומלץ, תוכל להשתמש בשיטת Escape() של סוג ה-regex על מנת להסיר אוטומטית את כל התווים המיוחדים.

PS> '[hello], world' -replace ([regex]::Escape('[hello]')),'goodbye'
goodbye, world

יש להשתמש בשיטת Escape() ככל האפשר כי היא תברות את כל התווים המיוחדים כדי שלא תצטרך לזכור אותם.

שימוש בקבוצות Match/Capture

בכל אחד מהדוגמאות הקודמות, המדריך הזה השתמש במחרוזת ממש להחלפת מחרוזת אחרת. עד כה, השתמשת ב־hi או goodbye. אבל מה קורה אם תרצה להשתמש בתו או תווים נוספים שנמצאים במחרוזת כדי להחליף עם? תצטרך להתאים או להשתמש ב־קבוצות תפיסה.

ברגולריות יש רעיון הקבוצות לתפיסה והתייחסויות חזרה. קבוצות התפיסה מאפשרות לך ל־לתפוס מחרוזות ולהתייחס אליהן במקומות אחרים. PowerShell משתמשת בתכונות האלו בעזרת קבוצות התאמה עם אופרטור ה־replace.

לדוגמה, אולי יש לך מחרוזת שעשויה להכיל ערכים שונים.

'hello world, you sexy beast'
'hi world, now go away'
'hello earth, you are lovely today'

תרצה להחליף את חלק הראשון של המחרוזת עם חלק השני כך שיראו כך:

'you sexy beast,hello world'
'now go away,hi world'
'you are lovely today,hello earth'

כדי לבצע פעולה זו, 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.

אתה יכול לראות דוגמה למטה.

## המחרוזת הזו יכולה גם להיות:
## 'hi, world, now go away'
## 'hello, earth, you are lovely today'
PS> $string = 'hello, world, you sexy beast'
PS> $string -replace '(.*), (.*)','$2,$1'
you sexy beast,hello world

בדוגמה למעלה, אתה יכול לראות קבוצות תפיסה שמאפסות כל התאמה (שלום עולם) ו- (אתה חיה מפנקת) בעזרת סוגריים. לאחר מכן, להחלפה, שלום עולם נמצא תחילה משמאל לימין ולכן מקבל תווית אספקה חזרה $1 ו- אתה חיה מפנקת מקבלת תווית אספקה חזרה $2.

כאשר PowerShell מכיר בערך של כל ההתאמה, אתה יכול להשתמש בהפניות אלו בטקסט המוחלף בכל דרך שתרצה. בדוגמה זו $2,$1 מחליפה את מקומם.

שימוש בקבוצות התאמה בשמות

אם אינך רוצה להשתמש במקומות מספר כמו $1, $2 כדי להתייחס לערכי ההתאמה, אפשר גם להשתמש בתוויות או בשמות. במקום להיות צריך לספור משמאל לימין איזה הפניות מהווות מה, אפשר פשוט להשתמש בשמות.

כדי להשתמש בשמות כהפניות, עליך תחילה להגדיר תוויות עבור כל התאמה במחרוזת ההתאמה. כדי לעשות זאת, עליך להגדיר את קבוצת התפיסה כמו (?<label><regex>) שבו label הוא השם ו- <regex> הוא הביטוי הרגיל שאתה משתמש בו.

כשהגדרת את השמות, תוכל להתייחס אליהם במחרוזת ההחלפה באמצעות סימן דולר ובאותו הזמן לארוז את השם בסוגריים מתוחכמים למשל. ${label}.

אתה יכול לראות הדגמה לטכניקה זו למטה.

PS> $string = 'hello, world, you sexy beast'
PS> $string -replace '(?<First_Part>.*), (?<Second_Part>.*)','${Second_Part},${First_Part}'
you sexy beast,hello, world

מסקנה

כפי שלמדת, אופרטור ההחלפה של PowerShell מאפשר לך להחליף תווים, טקסט ומחרוזות בדרכים רבות. כדי לבצע החלפות פשוטות, תוכל להשתמש במתודת replace(), אך אם תצטרך להתאים ולהחליף דברים מורכבים יותר, תשתמש תמיד באופרטור replace.

Source:
https://adamtheautomator.com/powershell-replace/