כיצד לבדוק אם מחרוזת מכילה מחרוזת ב- Bash

How Check If String Contains Substring Bash



השאלה היא כיצד בודקים אם מחרוזת מכילה מחרוזת משנה ב- Bash. התשובה היא: השתמש בהתאמת תבניות. זה מעורר שאלה נוספת, שהיא: מהו התאמת תבניות? ובכן, לביטוי במשפט יש מאפיינים מסוימים. לכן הוא שונה מביטויים אחרים באותו משפט או במשפטים אחרים. ניתן לקודד את המאפיינים כתבנית. באופן זה ניתן לזהות ביטוי מסוים במחרוזת. מאמר זה מסביר כיצד לזהות מחרוזת משנה מסוימת במחרוזת גדולה יותר, להחליף את מחרוזת המשנה המותאמת למחרוזת משנה אחרת, ולאתר כל מחרוזת משנה במחרוזת גדולה יותר לפי אינדקס. עם זאת, לפני שצוללים בהסברים, יש להיזכר בדרכים השונות שבהן נוצרת מחרוזת בבאש.

מחרוזת לפי מרחבי בריחה

ניתן לבנות מחרוזת על ידי החלפת כל חלל ברצף בריחת החלל, ''; כמו ב:







myVar= תיירות ב מצרים היא אחת של המדינה 'תעשיות מובילות כלכליות.
זרק $ myVar

הפלט הוא:



התיירות במצרים היא אחת התעשיות הכלכליות המובילות במדינה.



הערה: האפוסטרוף השתמש גם ברצף הבריחה מהחלל.





מחרוזת לפי ציטוטים בודדים

האם למתכנת יש זמן להימלט מכל הרווחים במחרוזת? לא. לכן, עדיף להשתמש בשתי מרכאות בודדות כדי לחלק מחרוזת; כמו:

myVar='התיירות במצרים היא אחת מהמדינה' 'הענפים הכלכליים המובילים. '

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



התיירות במצרים היא אחת התעשיות הכלכליות המובילות במדינה.

מחרוזת לפי ציטוטים כפולים

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

myVar= תיירות ב מצרים היא אחת של המדינה 'תעשיות מובילות כלכליות.
זרק $ myVar

הפלט הוא:

התיירות במצרים היא אחת התעשיות הכלכליות המובילות במדינה.

הערה: האפוסטרוף השתמש גם ברצף הבריחה מהחלל.

במאמר זה, סוג המחרוזת העיקרי הנחשב הוא המחרוזת במרכאות בודדות.

יסודות ביטוי רגיל

Regex

שקול את המחרוזת הזו:

העולם הזה הוא לא באמת הבית שלנו.

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

התאמה פשוטה

בקוד הבא, אם המילה 'עולם' נמצאת במטרה, היינו אומרים שהמילה הותאמה.

עמ='העולם הזה הוא לא באמת הבית שלנו'.
reg='עוֹלָם'
אם [[ $ str= ~$ reg ]];לאחר מכן
זרקמצאתי
אַחֵר
זרקלא נמצא
לִהיוֹת

= ~, שהוא אופרטור ההקצאה ואחריו ~, נקרא אופרטור הכריכה. התנאי בודק אם התבנית תואמת במחרוזת היעד. אם נמצא מטרה משנה המתאימה לתבנית במטרה, הצהרת ההד מציגה נמצאה. אם הוא לא נמצא, הצהרת ההד מהדהדת לא נמצאה. הפלט לקוד זה הוא:

מצאתי

כפי שהתבנית, העולם, נמצאת במטרה. שים לב שהמרווח התוחם לאחר [[ולפני]] נשמר.

תבנית

בקוד הנ'ל, 'עולם' במרכאות הוא הרקס, בעוד שהעולם עצמו הוא הדפוס. זהו דפוס פשוט. עם זאת, רוב הדפוסים אינם כה פשוטים. דפוס הוא אפיון של מחרוזת משנה שיש למצוא. וכך, תבנית הבש משתמשת במטא -תווים מסוימים. מטא -דמות היא דמות על דמויות אחרות. לדוגמאות, תבנית Bash משתמשת במטא -תווים הבאים:

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

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

שיעורי דמויות

סוגריים מרובעים

הפלט של הקוד הבא נמצא, כלומר התקיימה התאמה:

עמ='החתול נכנס לחדר'.
אם [[ $ str= ~[cbr]בְּ-]];לאחר מכן
זרקמצאתי
לִהיוֹת

הדפוס, [cbr] at תאם חתול, שמתחיל ב- 'c', ואשר ממשיך ומסתיים ב-. [cbr] באמצעים, התאם את 'c' או 'b' או 'r' ואחריו את.

הפלט של הקוד הבא נמצא, כלומר התקיימה התאמה:

עמ='המחבט נכנס לתא.'
אם [[ $ str= ~[cbr]בְּ-]];לאחר מכן
זרקמצאתי
לִהיוֹת

הדפוס, [cbr] at תאם עטלף, שמתחיל ב- 'b', ואשר ממשיך ומסתיים ב-. [cbr] באמצעים, התאם את 'c' או 'b' או 'r' ואחריו את.

הפלט של הקוד הבא נמצא, כלומר התקיימה התאמה:

עמ='החולדה נכנסה לחדר'.
אם [[ $ str= ~[cbr]בְּ-]];לאחר מכן
זרקמצאתי
לִהיוֹת

הדפוס, [cbr] at תאם עכברוש, שמתחיל ב- 'r', ואשר ממשיך ומסתיים ב-.

בדוגמאות הקוד לעיל, המתכנת אינו יודע אם קיימים חתול או עטלף או חולדה במחרוזת המטרה. אבל, הוא יודע שרשת המשנה מתחילה ב- 'c' או 'b' או 'r', ואז ממשיכה ומסתיימת ב-. סוגריים מרובעים בתבנית מאפשרים לדמויות אפשריות שונות להתאים תו אחד במיקום ביחס לאחרים במטרה. אז סוגריים מרובעים מכילים קבוצת תווים, מתוכם אחד מתאים למחרוזת משנה. לבסוף, זוהי מחרוזת המשנה השלמה שתואמת.

מגוון דמויות

בקוד לעיל [cbr] היא מחלקה. גם אם 'c' או 'b' או 'r' תואם תו יחיד, אם בשלב זה מיד לא תואם, התבנית לא תתאים לשום דבר.

ובכן, ישנם טווחים מסוימים שיהוו כיתה. לדוגמה, 0 עד 9 ספרות יוצרות את המחלקה, [0-9] עם 0 ו- 9 כלולות. האותיות הקטנות 'א' עד 'ז' יוצרות את המעמד [א-ז] עם 'א' ו'ז 'כלולות. האותיות הגדולות '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]תְעוּדַת זֶהוּת ]];לאחר מכן
זרקמצאתי
לִהיוֹת

הפלט הוא: נמצא. '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.9W.Y.A]];לאחר מכן
זרקמצאתי
לִהיוֹת

פלט הקוד נמצא מכיוון שהתווים האחרים תואמים. נקודה אחת תואמת את '5'; נקודה נוספת תואמת את 'X'; והנקודה האחרונה תואמת נקודה.

חלופה תואמת

שקול את המשפט הזה עבור מחרוזת מטרה:

בכלוב יש ציפורים מסוגים שונים.

מישהו ירצה לדעת אם למטרה זו יש יונה או טווס או נשר. ניתן להשתמש בקוד הבא:

עמ='לכלוב יש טווסים מסוגים שונים.'
אם [[ $ str= ~ יונה|טַוָס|נשר]];לאחר מכן
זרקמצאתי
אַחֵר
זרקלא נמצא
לִהיוֹת

הפלט הוא, נמצא. המטא -אופי לסירוגין, | הועסקה. יכולות להיות שתיים, שלוש, ארבע ועוד חלופות. מה שהתאים בקוד הזה הוא 'טווס'.

הַקבָּצָה

בתבנית הבאה, סוגריים שימשו לקיבוץ תווים:

במה (רקדנית)

הקבוצה כאן היא רקדנית במה מוקפת במטא -דמויות (ו). (רקדן) היא תת -קבוצה, ואילו במה (רקדנית) היא כל הקבוצה. שקול את הדברים הבאים:

(הרקדן מדהים)

כאן, תת -הקבוצה או מחרוזת המשנה היא, רקדן הוא מדהים.

מתחים עם חלקים נפוצים

בעל עניין הוא אדם בעל אינטרס בעסק. תארו לעצמכם עסק עם אתר אינטרנט, stake.com. תארו לעצמכם שאחת ממחרוזות היעד הבאות נמצאת במחשב:

האתר, stake.com מיועד לעסק .;

יש בעל העניין .;

בעל העניין עובד עבור stake.com .;

תן לכל אחד מהמחרוזות האלה להיות המטרה. המתכנת ירצה לדעת אם stake.com או בעל עניין נמצאים בכל מחרוזת יעד. התבנית שלו תהיה:

stake.com | בעל עניין

באמצעות חילוף.

ההימור הוקלד פעמיים בשתי המילים. ניתן להימנע מכך על ידי הקלדת התבנית כדלקמן:

יתד (.com | מחזיק)

בעל .com | היא קבוצת המשנה במקרה זה.

הערה: השימוש בתו החלופה במקרה זה. עדיין יתבצע חיפוש אחר stake.com או בעל עניין. הפלט של הקוד הבא נמצא:

עמ='האתר, stake.com מיועד לעסק.'
אם [[ $ str= ~ יתד(.עם|מַחְזִיק) ]];לאחר מכן
זרקמצאתי
לִהיוֹת

מחרוזת המשנה המתאימה כאן היא stake.com.

המערך BASH_REMATCH המוגדר מראש

BASH_REMATCH הוא מערך מוגדר מראש. נניח שלתבנית יש קבוצות. כל הקבוצה התאמה, נכנסת לתא עבור אינדקס 0 של מערך זה. תת -הקבוצה הראשונה תואמת, נכנסת לתא עבור אינדקס 1; תת -הקבוצה השנייה תואמת, נכנסת לתא לאינדקס 2 וכן הלאה. הקוד הבא מראה כיצד להשתמש במערך זה:

עמ='רקדן הבמה הגיע'.
אם [[ $ str= ~ שלב (רַקדָן) ]];לאחר מכן
זרקמצאתי
לִהיוֹת

לאניב $ {! BASH_REMATCH [@]};לַעֲשׂוֹת
printf '$ {BASH_REMATCH [i]}, '
בוצע
זרק

הפלט הוא:

מצאתי
רקדן במה, רקדן,

כל הקבוצה רקדנית במה. יש רק תת -קבוצה אחת, שהיא רקדנית.

הערה: החלל בתבנית נמלט.

התאמה עצמאית של אותיות גדולות/קטנות

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

חנויות התאמה לילית

עמ='אנחנו אוהבים מוזיקה טובה.'
אם [[ $ str= ~ GoOd]];לאחר מכן
זרקמצאתי
לִהיוֹת

חנויות -uהתאמה לילית

הפלט הוא: נמצא. התבנית היא, GoOd. שרשרת המשנה המותאמת היא 'טובה'. שים לב כיצד האפשרות nocasematch הופעלה בתחילת קטע הקוד והושבתה בסוף קטע הקוד.

אורך מחרוזת

התחביר לקבלת אורך המחרוזת הוא:

$ {#PARAMETER}

דוגמא:

עמ='אנחנו אוהבים מוזיקה טובה.'
זרק $ {# str}

הפלט הוא: 19.

הפחתת מחרוזות

התחביר להפחתת מחרוזות הוא:

$ {PARAMETER: OFFSET}
$ {PARAMETER: OFFSET: LENGTH}

כאשר הספירה ל- OFFSET מתחילה מאפס.

הדוגמה הבאה מראה כיצד להסיר את 11 התווים הראשונים של מחרוזת:

עמ='אני תמיד רוקד למוזיקה טובה'.
זרק $ {str: 10}

הפלט הוא:

אס למוסיקה טובה.

ספירת LENGTH מתחילה מהדמות הבאה. הקוד הבא מראה כיצד ניתן לאפשר חלק בתוך המחרוזת:

עמ='אני תמיד רוקד למוזיקה טובה'.
זרק $ {str: 10: 6}

הפלט הוא:

אס t

11 התווים הראשונים הוסרו; 6 התווים הבאים הורשו, ושאר הדמויות הוסרו אוטומטית.

חפש והחליף

כאשר נמצא מחרוזת משנה, ניתן להחליפה עם מחרוזת משנה נוספת. התחביר לכך הוא:

איפה=$ {PARAMETER/PATTERN/REPLACEMENT}
איפה=$ {PARAMETER // PATTERN/REPLACEMENT}
איפה=$ {PARAMETER/PATTERN}
איפה=$ {PARAMETER // PATTERN}

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

עמ='בחדר יש חולדה, עטלף וחתול'.
ימין=$ {str/[cbr] at/big cow}
זרק $ str
זרק $ ret

הפלט הוא:

בחדר יש חולדה, עטלף וחתול.
בחדר יש פרה גדולה, עטלף וחתול.

עבור התחביר השני עם קווים כפולים קדימה, כל המופעים של ההתאמה מוחלפים. דוגמא:

עמ='בחדר יש חולדה, עטלף וחתול'.
ימין=$ {str // [cbr] at/big cow}
זרק $ str
זרק $ ret

הפלט הוא:

בחדר יש חולדה, עטלף וחתול.
יש פרה גדולה, פרה גדולה ופרה גדולה, בחדר.

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

כמו כן, מחרוזת המשנה הראשונה שנמצאה נמחקת. דוגמא:

עמ='בחדר יש חולדה, עטלף וחתול'.
ימין=$ {str/[cbr] ב-}
זרק $ str
זרק $ ret

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

עמ='בחדר יש חולדה, עטלף וחתול'.
ימין=$ {str // [cbr] ב-}
זרק $ str
זרק $ ret

הפלט הוא:

בחדר יש חולדה, עטלף וחתול.
יש a, a ו- a בחדר.

סיכום

על מנת לבדוק אם למחרוזת יש מחרוזת משנה ב- Bash, יש להשתמש בהתאמת תבניות. התאמת תבניות לא מתקיימת רק בסוגריים כפולים במצב, [[. . . ]]. זה יכול להתרחש גם בהרחבת פרמטרים, עם $ {. . .}. עם הרחבת פרמטרים, ניתן להשיג מחרוזת משנה על ידי אינדקסים.

מה שהוצג במאמר זה הן הנקודות הקריטיות ביותר בהתאמת תבניות. יש עוד! עם זאת, מה שהקורא צריך ללמוד אחר כך הוא הרחבת שם הקובץ.