Archive for the 'regex' Category

להתעדכן בחדשות משורת הפקודה (bash)

בהמשך לזה וזה, גם אני בפוסט תגובה.

s="$(curl -s http://www.ynet.co.il/Integration/StoryRss1854.xml|iconv -f windows-1255)"; while [[ "$s" =~ ry\>\<title\>([^<]+) ]]; do s=${s/"${BASH_REMATCH[0]}"}; echo ${BASH_REMATCH[1]}; done|fribidi

באגים ידועים:
מכוער.
לא מקודד סימני HTML.

תלויות:
curl
iconv
fribidi – מומלץ, לא הכרחי.

ביטויים רגולריים (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"