הפקודה 'sed' של לינוקס מייצגת עורך זרם. הוא משמש לעריכת זרמים (קבצים) באמצעות ביטויים רגולריים. אבל עריכה זו אינה קבועה. זה נשאר רק בתצוגה, אבל בפועל, תוכן הקובץ נשאר זהה.
בעיקר, הוא משמש להחלפת טקסט; בנוסף, ניתן להשתמש בו עבור פעולות אחרות של מניפולציה של טקסט כמו הוספה, מחיקה, חיפוש ועוד. הפקודה sed מאפשרת לנו לערוך קבצים מבלי לפתוח אותם. תמיכה בביטוי רגולרי הופכת אותו לכלי חזק יותר למניפולציה של טקסט.
סקירה כללית של פקודת sed
זהו כלי עזר יוניקס הממיר ומנתח טקסט בשפת תכנות קומפקטית ופשוטה. היא שולבה בין 1973 ל-1974 על ידי Lee E. McMahon מ-Bell Labs והיא נוכחת כיום כמעט בכל מערכת הפעלה. הפקודה sed התבססה על היבטי התסריט של ה-qed הקודם (עורך מהיר) ושל העורך האינטראקטיבי של ed. זה היה הכלי המוקדם ביותר לתמיכה בביטויים רגולריים, והוא נשאר פעיל לעיבוד טקסט, והכי חשוב עם פקודת ההחלפה. כלים אלטרנטיביים מפורסמים כוללים את Perl ו-AWK for 'עריכת זרם' ומניפולציה של מחרוזת טקסט רגיל.
מצב תפעול של פיקוד sed
הפקודה sed היא כלי עזר מכוון שורה לעיבוד טקסט: היא שורה אחר שורה קוראת טקסט מקובץ או זרם קלט לתוך מאגר פנימי המכונה מרחב הדפוס. כל קריאות השורות מתחילות מחזור. הפקודה sed משתמשת בפעולה אחת או מרובות שתוארו על ידי סקריפט sed למרחב הדפוס. הוא מפעיל שפת תכנות באמצעות כ-25 פקודות המתארות את הפעולות על פני הטקסט.
עבור כל שורות הקלט, הפקודה sed בדרך כלל מביאה למרחב הדפוס ומתחילה את המחזור עם השורה הבאה שוב לאחר ביצוע הסקריפט. אופי סוף-סקריפט אחרים זמינים מפקודות סקריפט ואפשרויות הגדרה, למשל, N כדי לכלול מיד את השורה הבאה במרחב הדפוס, q כדי להפסיק, d כדי להסיר את שטח הדפוס, וכן הלאה. לפיכך, סקריפט sed מתייחס לגוף לולאה שחוזר על ידי זרימה, שבה משתנה הלולאה והלולאה עצמה נשמרים ומרומזים על ידי sed.
- ניתן לתאר סקריפט sed בשורת הפקודה או לקרוא דרך קובץ מבודד. בסקריפט sed, פקודות עשויות לקחת כתובת נוספת בהקשר של ביטויים רגולריים או מספרי שורות. הכתובת מחליטה מתי הפקודה מבוצעת. לדוגמה, 2d יבצע רק את הפקודה d (או delete) בשורת הקלט השנייה, בעוד /^ /d יסיר כל שורה שמתחילה ברווח.
- מרחב ההחזקה, מאגר מיוחד מבודד, עשוי לשמש כמה פקודות sed להחזקת טקסט מצטבר בין מחזורים. לשפת הפקודה של sed יש שני משתנים בלבד (רווח דפוס ורווח החזקה) ופונקציונליות הסתעפות דמוית GOTO. עם זאת, השפה מלאה בטיורינג. סקריפטים אזוטריים זמינים עבור מספר משחקים כמו טטריס, שח, ארקנואיד וסוקובאן.
- הלולאה הראשית פועלת עבור כל השורות של זרם הקלט, בודקת את סקריפט ה-sed בכל השורות של הקלט. שורות הסקריפט ה-sed הן כולן זוג תבנית-פעולה, המייצגות איזו תבנית להתאמה ואיזו פעולה ליישם, אותה ניתן להעתיק כהצהרה מותנית. פעולות ברירת המחדל (שטח דפוס הדפסה, קו העתקה למרחב הדפוס), זרמי קלט ופלט ומשתני עבודה (רווח החזקה ומרחב דפוס) הן מרומזות; אפשר לציין תוכניות חד-שכבתיות קצרות בגלל הלולאה הראשית.
שימוש ב-sed Command
- הקרט (^) זהה לתחילת השורה.
- סמל הדולר ($) זהה להשלמת השורה.
- הכוכבית (*) זהה להופעת התווים הקודמים יותר או אפס.
- סימן הפלוס (+) זהה למופעי התו הקודמים אחד או מרובים.
- סימן השאלה (?) זהה להופעת התווים הקודמים יותר או אפס.
- סמל הנקודה (.) זהה לחלוטין לתו אחד.
הדוגמה להלן מייצגת את הפקודה והשימוש האופייני ביותר בפקודה sed, כלומר, החלפה. השימוש היה המניע בפועל לפקודת sed:
sed 's/regexp/replacement/g' inputFileName > outputFileName
דרכים אחרות אפשריות גם לעיבוד פשוט עם כ-25 פקודות סד. לדוגמה, להלן משתמש באפשרות d לסינון שורות הכוללות רק רווחים וסוף תו השורה:
sed '/^ *$/d' inputFileName
הדוגמה שלמעלה משתמשת בכמה מהתווים של הביטוי הרגולרי שלהלן:
לעתים קרובות, הפקודה sed משמשת כמסנן בתוך צינור תחת Unix:
$generateData | sed 's/x/y/g'
תוכנית generData מייצרת נתונים, והפקודה sed מבצעת שינוי קטן על ידי החלפת x במקום y.
לעתים קרובות, זה מועיל לשים פקודות sed רבות, פקודה בודדת בכל שורה, בתוך קובץ סקריפט ולהשתמש בדגל -f כדי לבצע את הפקודות מהקובץ:
sed -f subst.sed inputFileName > outputFileName
תחביר:
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
אפשרויות:
להלן כמה אפשרויות של שורת הפקודה של הפקודה sed:
-n, --שקט, --שקט: זה מאפשר לנו בכוח להדפיס של חלל דפוס.
-e script, --expression=script: הוא משמש להוספת הסקריפט לפקודות שיש לבצע.
-f script-file, --file=script-file: הוא משמש להוספת התוכן של קובץ הסקריפט לפקודות שיש לבצע.
--עקוב אחרי קישורים סימנים: הוא משמש כדי לעקוב אחר סימלינקים בעת עיבוד במקום.
תרשים ספרות רומיות 1 100
-i[SUFFIX], --in-place[=SUFFIX]: הוא משמש לעריכת קבצים במקום (יוצר גיבוי אם מסופקת אפשרות SUFFIX).
-l N, --line-length=N: הוא משמש כדי לציין את אורך גלישת השורה הרצוי עבור הפקודה 'l'.
--posix: הוא משמש כדי להשבית את כל ההרחבות של GNU.
-E, -r, --regexp-extended: זה מאפשר לנו להשתמש בביטויים הרגולריים המורחבים בסקריפט (עבור ניידות השתמש ב-POSIX -E).
-s, --הפרד: הוא משמש להתייחסות לקבצים כנפרדים ולא כיחידים וממשיך את הזרם הארוך.
--ארגז חול: הוא משמש להפעלה במצב ארגז חול.
-u, --unbuffered: הוא משמש לטעינת הכמויות המינימליות של נתונים מקבצי הקלט ושוטף את מאגרי הפלט לעתים קרובות יותר.
-z, --null-data: הוא משמש להפרדת שורות לפי תווי NUL.
--עֶזרָה: הוא משמש להצגת מדריך העזרה.
--גִרְסָה: הוא משמש להצגת מידע גרסה.
דוגמאות של sed Command
בואו נראה את הדוגמאות הבאות:
- הגשת בקשה לספריית STDIN
- החלפה גלובלית
- הסרת קו
- שימוש בפקודה Multiple sed
- קריאת פקודות מקובץ
- החלפת תווים
- הגבלת הסד
- הוספה והוספה של טקסט
- שינוי קווים
- טרנספורמציה של דמויות
- הדפסת מספרי השורות
הגשת בקשה לספריית STDIN
הפקודה sed אינה מוגבלת רק לתפעול קבצים; כמו כן, אנו יכולים להחיל אותו על ספריית STDIN.
echo class7 | sed 's/class/jtp/' echo class7 | sed 's/7/10/' cat msg.txt | sed 's/learn/study/'
הפקודות לעיל יחליפו את הטקסט הראשון בתבנית הטקסט השנייה. שקול את הפלט שלהלן:
מהפלט שלמעלה, ראשית, ביצענו את הפקודה 'sed' על מחרוזת 'class7' שבה 'class' משתנה ל-'jtp' ו-7 ל-10. לאחר מכן ביצענו את הפקודה 'sed' על זרם 'msg.txt' ' שבו 'למד' מומר ל'לימוד'.
החלפה גלובלית
בדוגמה הקודמת, כל המילים 'ללמוד' לא נערכו ל'לימוד'. כדי לערוך כל מילה, עלינו להשתמש בתחליף גלובלי 'g'. זה יערוך את כל המילים שצוינו בקובץ או מחרוזת.
תחביר:
command | sed 's///g'
שקול את הדוגמאות שלהלן:
echo class7 class9 | sed 's/class/jtp/g' cat msg.txt | sed 's/learn/study/g'
הפקודות לעיל יחליפו את כל דפוס הטקסט שצוין. שקול את הפלט שלהלן:
מהפלט לעיל, על ידי ביצוע הפקודה 'echo class7 class9 | sed 's/class/jtp/g'' כל ה'class' מומרים ל-'jtp' ועם הפקודה 'cat msg.txt | sed 's/learn/study/g'' כל ה-'learn' הומר ל'learn'.
הסרת קו
האפשרות 'd' תאפשר לנו להסיר שורה שלמה מקובץ. אנחנו צריכים רק לציין מילה מאותה שורה עם אפשרות 'd', והשורה הזו תימחק. אבל, שים לב שכל השורות עם אותה מילה יימחקו. זה יבוצע כ:
cat | sed '//d'
שקול את הפקודה הבאה:
cat msg.txt | sed '/jtp/d'
הפקודה לעיל תמחק את השורות עם המילה 'jtp'. שקול את הפלט שלהלן:
ההבדל בין נמר לאריה
מהפלט לעיל, על ידי ביצוע הפקודה 'cat msg.txt | sed '/jtp/d'' כל השורות המכילות את המילה 'jtp' נמחקות.
שימוש בפקודה Multiple sed
האפשרות '-e' מאפשרת לנו לבצע את פקודות ה-Sed המרובות בבת אחת. אנו יכולים לבצע יותר מפעולת sed אחת על ידי ביצוע הפקודה כ:
sed -e ' ; '
שקול את הפקודה הבאה:
sed -e 's/red/blue/; s/yellow/black/' exm.txt
הפקודה לעיל תחיל את כל הפעולות שצוינו בקובץ 'exm.txt'. שקול את הפלט שלהלן:
כפי שאנו יכולים לראות מהפלט לעיל, כל המילים ה'אדומות' מוחלפות ב'כחול', וכל המילים ה'צהובות' מוחלפות ב'שחור'. אנחנו יכולים גם להפריד פקודות כך:
sed -e ' >s/red/blue/; >s/yellow/black/' exm.txt
התוצאה תהיה זהה לפקודה לעיל.
קריאת פקודות מקובץ
אנחנו יכולים לשמור את פקודות sed בקובץ ולהחיל אותן בבת אחת בכל קובץ. ניתן לעשות זאת על ידי ציון האפשרות '-f' באופן הבא:
sed -f
מהפקודה לעיל, ה-'' הוא קובץ שיש לו רשימת פקודות sed. שקול את הפקודה הבאה:
sed -f SedCommands exm.txt
הפקודה לעיל תחיל את כל הפקודות שצוינו בקובץ 'SedCommand' ב-'exm.txt'. שקול את הפלט שלהלן:
מהפלט לעיל, השתמשנו בפקודות שהוחלו על הדוגמה הקודמת. אז הפלט זהה לדוגמא הקודמת.
החלפת תווים
נוכל להשתמש בסימן הקריאה (!) כמפריד מחרוזת. לדוגמה, אנו רוצים להחליף את ה-bash shell ולהחליף אותה ב-csh shell ב-'/etc/passwd'. כדי לעשות זאת, בצע את הפקודה הבאה:
sed 's//bin/bash//bin/csh/' /etc/passwd
נוכל להשיג את אותה תוצאה על ידי ביצוע הפקודה הבאה:
sed 's!/bin/bash!/bin/csh!' /etc/passwd
הגבלת הסד
השימוש הבסיסי בפקודת sed מעבד את כל הקובץ. אבל, אנחנו יכולים להגביל את פקודת sed ולציין כל שורה. ישנן שתי דרכים להגביל את פקודת sed:
- מגוון קווים.
- תבנית התואמת לקו ספציפי.
אנו יכולים לספק מספר לציון שורה באופן הבא:
sed '3s/Red/Blue/' exm.txt
הפקודה לעיל תחיל את הפעולה שצוינה בשורה השלישית. שקול את הפלט שלהלן:
מהפלט לעיל, רק השורה השלישית משתנה.
אנו יכולים גם לציין טווח של קווים. כדי לציין טווח של שורות, בצע את הפקודה באופן הבא:
sed '1,3s/Red/Blue/' exm.txt
הפקודה לעיל תעדכן את הטקסט שצוין בשורות 1 ו-3. שקול את הפלט שלהלן:
הוספה והוספה של טקסט
הדגל 'i' ו-'a' משמש להוספה והוספה של הטקסט בקובץ. הדגל 'i' יוסיף את הטקסט לפני המחרוזת, והדגל 'a' משמש להוספת טקסט אחרי המחרוזת. שקול את הפקודה הבאה:
echo 'Another Demo' | sed 'iFirst Demo'
הפקודה לעיל תכניס את הטקסט לפני הטקסט 'עוד הדגמה'. שקול את הפלט שלהלן:
כדי להוסיף טקסט, בצע את הפקודה באופן הבא:
echo 'Another Demo' | sed 'aFirst Demo'
הפקודה לעיל תוסיף את הטקסט. שקול את הפלט שלהלן:
שינוי קווים
הדגל 'c' משמש לשינוי שורה ספציפית. כדי לשנות שורה, בצע את הפקודה באופן הבא:
sed '3cThis is a modified line.' exm.txt
הפקודה לעיל תעדכן את שורה שלוש. שקול את הפלט שלהלן:
אנו יכולים גם להשתמש בביטוי רגולרי כדי לעדכן יותר משורה אחת בעלת אותה תבנית. שקול את הפקודה הבאה:
sed '/Apple is /c Line updated.' exm.txt
הפקודה לעיל תעדכן את כל השורות עם המחרוזת 'Apple is'. שקול את הפלט שלהלן:
טרנספורמציה של דמויות
הדגל 'y' משמש כדי להפוך את הדמויות. לא ניתן להגביל את השינוי של תווים להתרחשויות ספציפיות. כדי להפוך תווים, בצע את הפקודה באופן הבא:
sed 'y/abc/def/' exm.txt
הפקודה לעיל תהפוך את התווים 'a', 'b', 'c' ל-'d', 'e', 'f'. שקול את הפלט שלהלן:
הדפסת מספרי השורות
הסימן '=' משמש להדפסת מספר השורה. כדי להדפיס את מספר השורה, בצע את הפקודה כדלקמן:
sed '=' exm.txt
הפקודה לעיל תציג את מספר השורה של תוכן הקובץ. שקול את הפלט שלהלן:
סימן השוויון עם האפשרות '-n' מציין את מספר השורה שמכיל סקריפט תואם. שקול את הפלט שלהלן:
מיזוג מיון
sed -n '/mango/=' exm.txt
הפקודה לעיל תציג את מספר השורה המכילה את המילה 'מנגו'. שקול את הפלט שלהלן:
מהפלט לעיל, אנו יכולים לראות שלשורה מספר 2 יש את המילה 'מנגו'.