היום למדתי: fgrep לעומת grep
כשאתם נותנים ל AI לכתוב Shell Scripts שמחפשים בקבצים הוא אוהב להשתמש ב grep. זה עובד בשמות פשוטים ויכול לבלבל כשהשמות מכילים תווים מיוחדים של ביטויים רגולארים.
לדוגמה נתון קובץ טקסט עם השורות הבאות:
line1
line2
line3
line4
line.txt
בשביל לבדוק אם קיימת בו השורה line3 נוכל לכתוב:
$ grep line3 demo.txt
ונקבל את השורה.
בשביל לבדוק אם קיימת בו השורה line.txt מפתה לכתוב גם:
$ grep line.txt demo.txt
וזה גם עובד ומדפיס את line.txt - אבל זה בטעות. הנקודה ב line.txt היא תו של ביטויים רגולאריים ובעצם מתאימה לכל תו. לדוגמה אם הקובץ שלנו מכיל:
line-txt
line_txt
line2txt
אותה פקודת grep תחזיר את כל השורות:
grep line.txt demo.txt
line.txt
line-txt
line_txt
line2txt
מה עושים? נזכרים בטיפ בכותרת. פקודת grep -F או פקודת fgrep מחפשות טקסט פשוט ולא ביטוי רגולארי לכן כשאנחנו מחפשים טקסט רגיל נעדיף לכתוב:
$ fgrep line.txt demo.txt
line.txt
ונקבל רק את השורה עם הנקודה ולא את השורות שמתאימות לביטוי הרגולארי.
נ.ב. grep עצמו מבלבל כי הוא מתעלם באופן אוטומטי מתווים מסוימים של ביטויים רגולאריים במיוחד פלוס, כלומר אם בקובץ יש לי את השורות:
2+4
2229
פקודת grep תחזיר ממש את הפלוס ותתעלם מהפלוס במשמעותו המיוחדת של "תו נוסף" שאנחנו מכירים מביטויים רגולאריים:
$ grep '2+' demo.txt
2+4
אבל זו רק הטעיה כי אם מוסיפים לה \ לפני הפלוס היא חוזרת להתיחס אליו כמו תו של ביטויים רגולאריים:
$ grep '2\+' demo.txt
2+4
2229