ארכיון עבור מרץ, 2010

ביטויים רגולריים (regex) בbash

בעבר חיפשתי בגוגל מידע על ביטויים רגולריים – regex בשפת התכנות bash, התוצאות הציעו הצעות מגוונות איך לעשות את זה: grep ,awk ,sed וכדו'… אבל זה עדיין לא bash.

תוצאות אחרות דיברו על אפשרות בסגנון זה:

‎[[ "$var" =~ regex ]]‎

שאומנם נתן משהו מתוך bash אך לא כ"כ הבנתי איך ניתן להשתמש בזה.

לאחרונה חיפשתי שוב, והנה הפתרון שמצאתי:

כדי להכניס טקסט לתוך ביטוי רגולרי מבצעים

[[ "regex" =~ ^re(.*)x$ ]]‎

פעולה זו כאשר הביטוי הרגולרי נמצא תחזיר true ותיצור משתנה מערך: ‎${BASH_REMATCH[*]}‎, אם הביטוי לא יימצא הפעולה תחזיר false.
במערך זה באינדקס 0 יהיה את תוצאת הביטוי הרגולרי שנמצאה ובשאר המשתנים ההתאמות הפנימיות

דוגמה:

‭[[ "testregexexample" =~ st(r.*ex)([ejg]) ]];
echo ${BASH_REMATCH[@]};

יוציא את הפלט: stregexe regex e

testregexexample – תוצאת הביטוי במלואה, נכנסת לאינדקס 0.
testregexexample – התאמה ראשונה, נכנסת לאינדקס 1.
testregexexample – התאמה שנייה, נכנסת לאינדקס 2.


ולסיום, שאלה: האם BASH לא תומך פה בצורה תקינה בקידוד ISO-8859?
בקידוד זה תוצאות שהינם בתווים עבריים (לא בדקתי תווים לא לטיניים אחרים) לא מופעל עליהם באופן תקין regex:

[[ ‎"אבגדה‎" =~ ^‎אבג‎(.*) ]] && echo "${BASH_REMATCH[@]}"

בקידוד UTF-8 מוחזר: "אבגדה דה" – כמו שצריך להיות
בקידוד ISO-8859-8 מוחזר: "אבג"

[[ "‎אבגדה‎" =~ ^א‎.*‎ה‎ ]] && echo "${BASH_REMATCH[@]}" || echo "false"

בקידוד UTF-8 מוחזר: "אבגדה" – כמו שצריך להיות
בקידוד ISO-8859-8 מוחזר: "false"

מודעות פרסומת