logo

Sed Command בלינוקס/יוניקס עם דוגמאות

הפקודה '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פקודות אחרות של sed
    דרכים אחרות אפשריות גם לעיבוד פשוט עם כ-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

הפקודה sed אינה מוגבלת רק לתפעול קבצים; כמו כן, אנו יכולים להחיל אותו על ספריית STDIN.

 echo class7 | sed 's/class/jtp/' echo class7 | sed 's/7/10/' cat msg.txt | sed 's/learn/study/' 

הפקודות לעיל יחליפו את הטקסט הראשון בתבנית הטקסט השנייה. שקול את הפלט שלהלן:

מסנן Linux Sed

מהפלט שלמעלה, ראשית, ביצענו את הפקודה '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' 

הפקודות לעיל יחליפו את כל דפוס הטקסט שצוין. שקול את הפלט שלהלן:

מסנן Linux Sed

מהפלט לעיל, על ידי ביצוע הפקודה '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'. שקול את הפלט שלהלן:

ההבדל בין נמר לאריה
מסנן Linux Sed

מהפלט לעיל, על ידי ביצוע הפקודה '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'. שקול את הפלט שלהלן:

מסנן Linux Sed

כפי שאנו יכולים לראות מהפלט לעיל, כל המילים ה'אדומות' מוחלפות ב'כחול', וכל המילים ה'צהובות' מוחלפות ב'שחור'. אנחנו יכולים גם להפריד פקודות כך:

 sed -e ' >s/red/blue/; >s/yellow/black/' exm.txt 

התוצאה תהיה זהה לפקודה לעיל.

קריאת פקודות מקובץ

אנחנו יכולים לשמור את פקודות sed בקובץ ולהחיל אותן בבת אחת בכל קובץ. ניתן לעשות זאת על ידי ציון האפשרות '-f' באופן הבא:

 sed -f 

מהפקודה לעיל, ה-'' הוא קובץ שיש לו רשימת פקודות sed. שקול את הפקודה הבאה:

 sed -f SedCommands exm.txt 

הפקודה לעיל תחיל את כל הפקודות שצוינו בקובץ 'SedCommand' ב-'exm.txt'. שקול את הפלט שלהלן:

מסנן Linux Sed

מהפלט לעיל, השתמשנו בפקודות שהוחלו על הדוגמה הקודמת. אז הפלט זהה לדוגמא הקודמת.

החלפת תווים

נוכל להשתמש בסימן הקריאה (!) כמפריד מחרוזת. לדוגמה, אנו רוצים להחליף את ה-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 

הפקודה לעיל תחיל את הפעולה שצוינה בשורה השלישית. שקול את הפלט שלהלן:

מסנן Linux Sed

מהפלט לעיל, רק השורה השלישית משתנה.

אנו יכולים גם לציין טווח של קווים. כדי לציין טווח של שורות, בצע את הפקודה באופן הבא:

 sed '1,3s/Red/Blue/' exm.txt 

הפקודה לעיל תעדכן את הטקסט שצוין בשורות 1 ו-3. שקול את הפלט שלהלן:

מסנן Linux Sed

הוספה והוספה של טקסט

הדגל 'i' ו-'a' משמש להוספה והוספה של הטקסט בקובץ. הדגל 'i' יוסיף את הטקסט לפני המחרוזת, והדגל 'a' משמש להוספת טקסט אחרי המחרוזת. שקול את הפקודה הבאה:

 echo 'Another Demo' | sed 'iFirst Demo' 

הפקודה לעיל תכניס את הטקסט לפני הטקסט 'עוד הדגמה'. שקול את הפלט שלהלן:

מסנן Linux Sed

כדי להוסיף טקסט, בצע את הפקודה באופן הבא:

 echo 'Another Demo' | sed 'aFirst Demo' 

הפקודה לעיל תוסיף את הטקסט. שקול את הפלט שלהלן:

מסנן Linux Sed

שינוי קווים

הדגל 'c' משמש לשינוי שורה ספציפית. כדי לשנות שורה, בצע את הפקודה באופן הבא:

 sed '3cThis is a modified line.' exm.txt 

הפקודה לעיל תעדכן את שורה שלוש. שקול את הפלט שלהלן:

מסנן Linux Sed

אנו יכולים גם להשתמש בביטוי רגולרי כדי לעדכן יותר משורה אחת בעלת אותה תבנית. שקול את הפקודה הבאה:

 sed '/Apple is /c Line updated.' exm.txt 

הפקודה לעיל תעדכן את כל השורות עם המחרוזת 'Apple is'. שקול את הפלט שלהלן:

מסנן Linux Sed

טרנספורמציה של דמויות

הדגל 'y' משמש כדי להפוך את הדמויות. לא ניתן להגביל את השינוי של תווים להתרחשויות ספציפיות. כדי להפוך תווים, בצע את הפקודה באופן הבא:

 sed 'y/abc/def/' exm.txt 

הפקודה לעיל תהפוך את התווים 'a', 'b', 'c' ל-'d', 'e', ​​'f'. שקול את הפלט שלהלן:

מסנן Linux Sed

הדפסת מספרי השורות

הסימן '=' משמש להדפסת מספר השורה. כדי להדפיס את מספר השורה, בצע את הפקודה כדלקמן:

 sed '=' exm.txt 

הפקודה לעיל תציג את מספר השורה של תוכן הקובץ. שקול את הפלט שלהלן:

מסנן Linux Sed

סימן השוויון עם האפשרות '-n' מציין את מספר השורה שמכיל סקריפט תואם. שקול את הפלט שלהלן:

מיזוג מיון
 sed -n '/mango/=' exm.txt 

הפקודה לעיל תציג את מספר השורה המכילה את המילה 'מנגו'. שקול את הפלט שלהלן:

מסנן Linux Sed

מהפלט לעיל, אנו יכולים לראות שלשורה מספר 2 יש את המילה 'מנגו'.