קבוצות תווים
באש מספקת לנו מספר אופציות להשתמש בregex לשימושים שנצרכים לעיתים קרובות בלא לכתוב regex, היכולת הזאת בשפה של באש נקראת Character classes והיא נראית כך
אם נתבונן נראה שכל האותיות נמחקו אבל הרווחים נשארו, והסיבה לכך היא שהורדנו רק אותיות ולא את הרווחים, בשביל להסיר גם את הרווחים ניתן להשתמש בביטוי [:space:] שתופס רווחים.
להלן רשימה חלקית של הביטויים
#grep
#sed
#regex
#tr
Character classes
רמת קושי: #beginners
אני מניח שלכל אחד יש יחסי אהבה שנאה עם regex, regex מספק יכולת ממש טובה לבחור טקסט אבל הקריאות שלו מזעזעת במקרה הטוב.באש מספקת לנו מספר אופציות להשתמש בregex לשימושים שנצרכים לעיתים קרובות בלא לכתוב regex, היכולת הזאת בשפה של באש נקראת Character classes והיא נראית כך
[[:alpha:]]
, לדוגמה.$ echo "Have a nice day :-)" | tr -d "[[:alpha:]]"
:-)
ביטוי שבוחר את כל האותיות וכפי שניתן לראות כל האותיות נבחרו ונמחקו. אם נתבונן נראה שכל האותיות נמחקו אבל הרווחים נשארו, והסיבה לכך היא שהורדנו רק אותיות ולא את הרווחים, בשביל להסיר גם את הרווחים ניתן להשתמש בביטוי [:space:] שתופס רווחים.
$ echo "Have a nice day :-)" | tr -d "[[:alpha:][:space:]]"
:-)
במידה ונרצה להפוך את הביטוי ניתן לעשות זאת על ידי ^
$ echo "1 1 root root $" | tr -d "[^[:alpha:]]"
rootroot
בעבר מספיק היה להשתמש בסוגריים מרובעות פעם אחת בשביל לממש את הביטוי לדוגמה [:print:]
, בגרסאות החדשות יותר של gnu צריכים להכפיל את הסוגריים למימוש הביטוי, וכמובן ניתן להשתמש ביותר מביטוי אחד בתוך סוגריים כפי שראינו לעיל [[:alpha:][:space:]].להלן רשימה חלקית של הביטויים
[:alpha:] == אותיות
[:digit:] == מספרים
[:space:] == תוים לבנים
[:blank:] == רווחים וטאבים
[:punct:] == תווים מיוחדים
[:alnum:] == [:alpha:][:digit:]
[:graph:] == [:alnum:][:punct:]
[:print:] == [:alnum:][:punct:][:space:]
[:xdigit:] == Hex
#character_classes#grep
#sed
#regex
#tr
@bash_tips👍1
Bash Tips
פקודת sed להשתמש ב ! במקום \ פקודה מוכרת בעולם הלינוקס היא sed פקודה שמאפשרת לבצע מניפולציות על טקסט מבלי לפתוח עורך טקסט הקובץ שלי מכיל את הטקסט הפשוט הבא $ cat test.txt my path is /tmp/test/hello שימוש בsed מאפשר להחליף טקסט קיים בקובץ ולשמור אותו.…
רמת קושי: #advanced
עברה תקופה למדנו החכמנו, קבלו שיפור לטיפ
ראינו בעבר שניתן להגדיר
חביב לא? רגע זה לא הדבר הכי משוגע שראיתם
כמובן שאם התו שאיתו בחרתי לעבוד קיים כחלק מהטקסט אצטרך להחריג אותו עם \ כמו כל משפט sed רגיל
פקודת sed מחפשת מהו התו שאחרי ה s ומחליטה להשתמש בו כחוצץ, במידה ואין הצהרה התחלתית במשפט ב sed איזה תהליך הוא הולך לבצע (delete למשל) צריך להחריג את התו הראשון כדי להסביר לsed שהוא נבחר להיות ה delimiter
#bre
עברה תקופה למדנו החכמנו, קבלו שיפור לטיפ
ראינו בעבר שניתן להגדיר
!
כ delimiter, הטיפ הבא מדבר על כך שכמעט כל תו חוץ מסלאש הפוך יוכל להיות delimiter, זה נראה כך$ echo sed is cool | sed 's|cool|great|g'
sed is great
$ echo sed is cool | sed 's#cool#great#g'
sed is great
$ echo sed is cool | sed 's_cool_great_g'
sed is great
$ echo sed is cool | sed 's^cool^great^g'
sed is great
טוב אני מניח שהבנתם את הרעיוןחביב לא? רגע זה לא הדבר הכי משוגע שראיתם
$ echo sed is cool | sed 'swcoolwgreatwg'
sed is great
כשאומרים כל תו הכוונה גם לאותיות, במקרה לעיל השתמשנו ב w בתור חוצץ.כמובן שאם התו שאיתו בחרתי לעבוד קיים כחלק מהטקסט אצטרך להחריג אותו עם \ כמו כל משפט sed רגיל
$ echo sed is cool | sed 'slcoo\llgreatlg'
sed is great
איך זה עובד?פקודת sed מחפשת מהו התו שאחרי ה s ומחליטה להשתמש בו כחוצץ, במידה ואין הצהרה התחלתית במשפט ב sed איזה תהליך הוא הולך לבצע (delete למשל) צריך להחריג את התו הראשון כדי להסביר לsed שהוא נבחר להיות ה delimiter
$ echo sed is not cool | sed '\|not|d'
#sed#bre
@bash_tips
Bash Tips
נענים לאתגר רמת קושי: #advanced האתגר הבא מבוסס על סיפור אמיתי, כמו רוב הטיפים בערוץ 😊. קובץ זיפ הבא מכיל רשימת קבצי דמה PDF של אקורדים לגיטרה בשמות עבריים, שמות הקבצים מורכבים משם הזמר ושם השיר (לרוב), חלק משמות הקבצים הן עם רווח והאחרים עם . או עם _ כמפריד…
פתרון האתגר סדר בחדר
רמת קושי: #beginners
משימה ראשונה
בואו נציץ לרגע במשימה הראשונה של האתגר ונראה מהי.
לבנות את עץ התיקיות על סמך זה ששם הזמר הוא בתחילת שם הקובץ,
שירים שאין להם שם זמר יכנסו לתיקיה בעלת שם השיר, או קומבינציה מוזרה אחרת.
האתגר הראשון בו אנו נתקלים כשאנו נגשים לאתגר הוא חוסר סטנדרטיזציה בשמות הקבצים, אם נעיף רגע מבט על כל הקבצים נשים לב שרוב הקבצים מסודרים כך ששם הזמר מופיע בתחילת שם הקובץ, אם כן בשביל להשיג סדר ראשוני בקבצים נוכל לארגן חלק ניכר מהקבצים על ידי שליפת 2 המילים הראשונות של שם הקובץ וליצור ממנו תיקייה.
וזה בדיוק מה שעושה הקוד הבא
שורה 3 ו 4: מעבירה את שם הקובץ את התהליך הבא שמורכב מ3 חלקים
1. מעבירה את שם הקובץ הבא לפקודת
2. פקודת
שלב א' היא מסירה את כל התווים המיוחדים והרווחים שמופיעים בתווים הראשונים של הקובץ .
שלב ב' היא מחליפה את תווי
מה שמביא אותנו למצב ששם הקובץ כרגע הוא כך
פקודת
ואז אנו מעבירים טווח של מילים אותם אנו רוצים לשלוף, 1-2 אלו שני המילים הראשונות.
אז כרגע בסופו של תהליך שורה 3 נראית כך
שורה 5: יוצרת תיקיית על שם הזמר.
שורה 6: מעתיקה את השיר לתיקייה שכרגע נוצרה.
התוצאה היא רשימת תיקיות שמכילות את שני המילים הראשונות של הקבצים.
קבצים שיש להם את אותם 2 מילים בראש הקובץ מקובצים תחת אותה תיקייה.
עד כאן חלק א' של האתגר
יש לכם רעיונות לשיפור, הערות, טיפים? מוזמנים לשתף בתגובות
בימים הקרובים אפרסם פתרון גם למשימה השניה, עד אז מי שרוצה לאתגר את עצמו מוזמן
#challenge
#loops
#sed
#cut
@bash_tips
רמת קושי: #beginners
משימה ראשונה
בואו נציץ לרגע במשימה הראשונה של האתגר ונראה מהי.
לבנות את עץ התיקיות על סמך זה ששם הזמר הוא בתחילת שם הקובץ,
שירים שאין להם שם זמר יכנסו לתיקיה בעלת שם השיר, או קומבינציה מוזרה אחרת.
האתגר הראשון בו אנו נתקלים כשאנו נגשים לאתגר הוא חוסר סטנדרטיזציה בשמות הקבצים, אם נעיף רגע מבט על כל הקבצים נשים לב שרוב הקבצים מסודרים כך ששם הזמר מופיע בתחילת שם הקובץ, אם כן בשביל להשיג סדר ראשוני בקבצים נוכל לארגן חלק ניכר מהקבצים על ידי שליפת 2 המילים הראשונות של שם הקובץ וליצור ממנו תיקייה.
וזה בדיוק מה שעושה הקוד הבא
1 for file in *;
2 do
3 sed_expr='s/^[[:punct:][:space:]]//g ; s/[_,-]/ /g'
4 dest="test/$(echo "${file}" | sed "$sed_expr" | cut -f 1-2 -d ' ' )"
5 mkdir -p "$dest"
6 cp "$file" "$dest"
7 done
שורה 1: אוספת את כל הקבצים שבתיקייה ומעבירה קובץ קובץ לעיבוד.שורה 3 ו 4: מעבירה את שם הקובץ את התהליך הבא שמורכב מ3 חלקים
1. מעבירה את שם הקובץ הבא לפקודת
sed
שמחה_פרידמן_עוד_יבוא_היום_אקורדים_קלים.pdf
2. פקודת
sed
מריצה שני עיבודים כדי ליצור סטנדרט בין כל הקבצים (;
הוא חוצץ בין שני הביטויים)שלב א' היא מסירה את כל התווים המיוחדים והרווחים שמופיעים בתווים הראשונים של הקובץ .
שלב ב' היא מחליפה את תווי
_ , -
ברווח.מה שמביא אותנו למצב ששם הקובץ כרגע הוא כך
שמחה פרידמן עוד יבוא היום אקורדים קלים.pdf
3. בחירה של 2 המילים הראשונות, איך זה קורה? פקודת
cut
מקבלת פרמטר לפיו היא מפצלת מילים על פי רווח, ואז אנו מעבירים טווח של מילים אותם אנו רוצים לשלוף, 1-2 אלו שני המילים הראשונות.
אז כרגע בסופו של תהליך שורה 3 נראית כך
dest="test/שמחה פרידמן"
מפה זה די פשוט וקלשורה 5: יוצרת תיקיית על שם הזמר.
שורה 6: מעתיקה את השיר לתיקייה שכרגע נוצרה.
התוצאה היא רשימת תיקיות שמכילות את שני המילים הראשונות של הקבצים.
קבצים שיש להם את אותם 2 מילים בראש הקובץ מקובצים תחת אותה תיקייה.
עד כאן חלק א' של האתגר
יש לכם רעיונות לשיפור, הערות, טיפים? מוזמנים לשתף בתגובות
בימים הקרובים אפרסם פתרון גם למשימה השניה, עד אז מי שרוצה לאתגר את עצמו מוזמן
#challenge
#loops
#sed
#cut
@bash_tips
שימוש בsed עם extended regex
רמת קושי: #beginners
טיפ חביב וקצרצר בקשר ל sed, המבנה הבסיסי של הפקודה מתבסס על ביטוי regex ואז הוראה מה נרצה לבצע לכל דבר שתואם לביטוי, העניין הוא שsed ברירת מחדל אינו משתמש בתצורה המורחבת של regex.
בכדי לאפשר extended regex לsed ניתן להשתמש בדגל
#regex
#extended_regex
@bash_tips
רמת קושי: #beginners
טיפ חביב וקצרצר בקשר ל sed, המבנה הבסיסי של הפקודה מתבסס על ביטוי regex ואז הוראה מה נרצה לבצע לכל דבר שתואם לביטוי, העניין הוא שsed ברירת מחדל אינו משתמש בתצורה המורחבת של regex.
בכדי לאפשר extended regex לsed ניתן להשתמש בדגל
-E
או -r
$ sed -E 's/something_(aaa|bbb|ccc)//g#sed
#regex
#extended_regex
@bash_tips