OnWorks Linux ו-Windows Online WorkStations

לוגו

אירוח מקוון בחינם עבור תחנות עבודה

<הקודם | תוכן | הבא>

צמא

שם צמא הוא קיצור של עורך זרמים. הוא מבצע עריכת טקסט על זרם טקסט, או קבוצה של קבצים שצוינו או קלט סטנדרטי. צמא היא תוכנית עוצמתית וקצת מורכבת (יש עליה ספרים שלמים), אז לא נסקור אותה לגמרי כאן.

באופן כללי, הדרך צמא עובד הוא שניתן לו פקודת עריכה בודדת (בשורת הפקודה) או שם של קובץ סקריפט המכיל מספר פקודות, ואז הוא מבצע את הפקודות הללו בכל שורה בזרם הטקסט. הנה דוגמה פשוטה מאוד של צמא בִּפְעוּלָה:


[me@linuxbox ~]$ הד "חזית" | sed 's/front/back/'

בחזרה

[me@linuxbox ~]$ הד "חזית" | sed 's/front/back/'

בחזרה


בדוגמה זו, אנו מייצרים זרם טקסט של מילה אחת באמצעות הד ומעבירים אותו לתוך צמא. צמא, בתורו, מבצע את ההוראה s/front/back/ על הטקסט בזרם ומייצר את הפלט "חזרה" כתוצאה מכך. אנו יכולים גם לזהות פקודה זו כדומה לפקודה "החלפה" (חפש והחלפה) ב vi.

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



[me@linuxbox ~]$ הד "חזית" | sed 's_front_back_'

בחזרה

[me@linuxbox ~]$ הד "חזית" | sed 's_front_back_'

בחזרה


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

רוב הפקודות ב צמא עשוי להקדים an כתובת, המציין אילו שורות של זרם הקלט יערכו. אם הכתובת מושמטת, פקודת העריכה היא car-


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



[me@linuxbox ~]$ הד "חזית" | sed '1s/front/back/'

בחזרה

[me@linuxbox ~]$ הד "חזית" | sed '1s/front/back/'

בחזרה


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



[me@linuxbox ~]$ הד "חזית" | sed '2s/front/back/'

חזית

[me@linuxbox ~]$ הד "חזית" | sed '2s/front/back/'

חזית


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

טבלה 20-7: סימון כתובת


תיאור הכתובת

תיאור הכתובת

n מספר שורה איפה n הוא מספר שלם חיובי.


תמונה

$ השורה האחרונה.


תמונה

/regexp/ שורות התואמות לביטוי רגולרי בסיסי של POSIX. שימו לב שהביטוי הרגולרי מופרד על ידי תווי לוכסן. לחלופין, הביטוי הרגולרי עשוי להיות מופרד על ידי תו חלופי, על ידי ציון הביטוי עם \cregexpc, שם c הוא הדמות החלופית.


תמונה

adr1,adr2 מגוון קווים מ adr1 ל adr2, כולל. הכתובות עשויות להיות כל אחד מטפסי הכתובת הבודדת שלמעלה.


תמונה

ראשון~צעד התאם את הקו המיוצג על ידי המספר ראשון, ואז כל שורה שלאחר מכן ב צעד מרווחים. לדוגמה 1~2 מתייחס לכל שורה אי זוגית, 5~5 מתייחס לשורה החמישית וכל שורה חמישית לאחר מכן.


תמונה

adr1,+n להתאים adr1 והדברים הבאים n קווים.


תמונה

Addr! התאם את כל השורות מלבד Addr, שיכול להיות כל אחד מהצורות שלמעלה.


תמונה


נדגים סוגים שונים של כתובות באמצעות ה distros.txt קובץ מקודם


בפרק זה. ראשית, טווח של מספרי שורות:


תמונה

[me@linuxbox ~]$ sed -n '1,5p' distros.txt

SUSE 10.2 12/07/2006

פדורה 10 11/25/2008

SUSE 11.0 06/19/2008

אובונטו 8.04 04/24/2008

פדורה 8 11/08/2007


בדוגמה זו, אנו מדפיסים טווח של שורות, החל משורה 1 וממשיכים לשורה 5. לשם כך, אנו משתמשים ב- p פקודה, שפשוט גורמת להדפסת שורה מותאמת. עם זאת, כדי שזה יהיה יעיל, עלינו לכלול את האפשרות -n (אפשרות ללא הדפסה אוטומטית) לגרום צמא לא להדפיס כל שורה כברירת מחדל.

לאחר מכן, ננסה ביטוי רגולרי:



[me@linuxbox ~]$

sed -n '/SUSE/p' distros.txt

SUSE 10.2

12/07/2006

SUSE 11.0

06/19/2008

SUSE 10.3

10/04/2007

SUSE 10.1

05/11/2006


על ידי הכללת הביטוי הרגולרי המופרד באלכסון /SUSE/, אנו מסוגלים לבודד את הקווים המכילים אותו באותו אופן כמו grep.

לבסוף, ננסה לשלול על ידי הוספת סימן קריאה (!) לכתובת:


[me@linuxbox ~]$

sed -n '/SUSE/!p' distros.txt

פדורה 10

11/25/2008

אובונטו 8.04

04/24/2008

פדורה 8

11/08/2007

אובונטו 6.10

10/26/2006

פדורה 7

05/31/2007

אובונטו 7.10

10/18/2007

אובונטו 7.04

04/19/2007

פדורה 6

10/24/2006

פדורה 9

05/13/2008

אובונטו 6.06

06/01/2006

אובונטו 8.10

10/30/2008

פדורה 5

03/20/2006


כאן אנו רואים את התוצאה הצפויה: כל השורות בקובץ מלבד אלו המתואמות על ידי ה-


הבעה רגילה.

עד כה, הסתכלנו על שניים צמא פקודות עריכה, s ו p. הנה רשימה מלאה יותר של פקודות העריכה הבסיסיות:


טבלה 20-8: פקודות עריכה בסיסיות


תיאור הפקודה

תיאור הפקודה

= פלט מספר קו נוכחי.


תמונה

a הוסף טקסט לאחר השורה הנוכחית.


תמונה

ד מחק את השורה הנוכחית.


תמונה

i הוסף טקסט לפני השורה הנוכחית.


תמונה

p הדפס את השורה הנוכחית. כברירת מחדל, sed מדפיס כל שורה ועורך רק שורות התואמות לכתובת שצוינה בתוך הקובץ. ניתן לעקוף את התנהגות ברירת המחדל על ידי ציון האפשרות -n.


תמונה

q יציאה צמא בלי לעבד שורות נוספות. אם ה

אפשרות -n לא צוינה, פלט את השורה הנוכחית.


תמונה

Q יציאה צמא מבלי לעבד שורות נוספות.


תמונה

s/regexp/תַחֲלִיף/ תחליף את התוכן של תַחֲלִיף בַּאֲשֶׁר

regexp נמצא. תַחֲלִיף עשוי לכלול את התו המיוחד &, שהוא שווה ערך לטקסט התואם על ידי regexp. בנוסף, תַחֲלִיף עשוי לכלול את הרצפים \1 דרך \9, שהם התוכן של ביטויי המשנה המתאימים ב regexp. למידע נוסף על כך, עיין בדיון על הפניות בחזרה לְהַלָן. לאחר החתך הנגרר תַחֲלִיף, ניתן לציין דגל אופציונלי כדי לשנות את s התנהגות הפקודה.


תמונה

y/Set1/Set2 בצע תעתיק על ידי המרת תווים מ Set1 לדמויות המתאימות ב Set2. שימו לב שלא כמו tr, צמא דורש ששני הסטים יהיו באותו אורך.


תמונה


השמיים s הפקודה היא ללא ספק פקודת העריכה הנפוצה ביותר. נדגים רק חלק מכוחו על ידי ביצוע עריכה במכשיר שלנו distros.txt קוֹבֶץ. דנו קודם איך שדה התאריך נכנס distros.txt לא היה "ידידותי למחשב" עבור-


מַחצֶלֶת. בעוד שהתאריך מעוצב MM/DD/YYYY, עדיף (למען קלות המיון) אם הפורמט היה YYYY-MM-DD. לבצע את השינוי הזה בקובץ באופן ידני ייקח זמן וגם נוטה לשגיאות, אבל עם צמא, ניתן לבצע את השינוי הזה בשלב אחד:


תמונה

[me@linuxbox ~]$ sed 's/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\

)$/\3-\1-\2/' distros.txt

SUSE 10.2 2006-12-07

פדורה 10 2008-11-25

SUSE 11.0 2008-06-19

אובונטו 8.04 2008-04-24

פדורה 8 2007-11-08

SUSE 10.3 2007-10-04

אובונטו 6.10 2006-10-26

פדורה 7 2007-05-31

אובונטו 7.10 2007-10-18

אובונטו 7.04 2007-04-19

SUSE 10.1 2006-05-11

פדורה 6 2006-10-24

פדורה 9 2008-05-13

אובונטו 6.06 2006-06-01

אובונטו 8.10 2008-10-30

פדורה 5 2006-03-20

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



סד של/regexp/תַחֲלִיף/' distros.txt

סד של/regexp/תַחֲלִיף/' distros.txt


הצעד הבא שלנו הוא למצוא ביטוי רגולרי שיבודד את התאריך. מכיוון שהוא בפורמט MM/DD/YYYY ומופיע בסוף השורה, נוכל להשתמש בביטוי כזה:



[0-9]{2}/[0-9]{2}/[0-9]{4}$

[0-9]{2}/[0-9]{2}/[0-9]{4}$


שמתאים לשתי ספרות, לוכסן, שתי ספרות, לוכסן, ארבע ספרות וסוף השורה. אז זה דואג regexp, אבל מה עם תַחֲלִיף? כדי לטפל בזה, עלינו להציג


תכונת ביטוי רגולרי חדשה המופיעה בכמה יישומים המשתמשים ב-BRE. תכונה זו נקראת הפניות בחזרה ועובד כך: אם הרצף \n מופיע ב החלפה איפה n הוא מספר מ-1 עד 9, הרצף יתייחס לתת-הביטוי המקביל בביטוי הרגולרי הקודם. כדי ליצור את ביטויי המשנה, אנו פשוט מקיפים אותם בסוגריים כך:



([0-9]{2})/([0-9]{2})/([0-9]{4})$

([0-9]{2})/([0-9]{2})/([0-9]{4})$


כעת יש לנו שלושה ביטויי משנה. הראשון מכיל את החודש, השני מכיל את היום בחודש, והשלישי מכיל את השנה. עכשיו אנחנו יכולים לבנות תַחֲלִיף באופן הבא:



\3-\1-\2

\3-\1-\2


מה שנותן לנו את השנה, מקף, חודש, מקף ויום. כעת, הפקודה שלנו נראית כך:


sed 's/([0-9]{2})/([0-9]{2})/([0-9]{4})$/\3-\1-\2/' distros.txt

sed 's/([0-9]{2})/([0-9]{2})/([0-9]{4})$/\3-\1-\2/' distros.txt


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



sed 's/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)$/\3-\1-\2/' dis tros.txt

sed 's/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)$/\3-\1-\2/' dis tros.txt


והנה יש לך את זה!

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


[me@linuxbox ~]$ echo "aaabbbccc" | sed 's/b/B/'

aaaBbbccc

[me@linuxbox ~]$ echo "aaabbbccc" | sed 's/b/B/'

aaaBbbccc


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



[me@linuxbox ~]$ echo "aaabbbccc" | sed 's/b/B/g'

aaaBBBcccc

[me@linuxbox ~]$ echo "aaabbbccc" | sed 's/b/B/g'

aaaBBBcccc


עד כה, רק נתנו צמא פקודות בודדות דרך שורת הפקודה. אפשר גם לבנות פקודות מורכבות יותר בקובץ סקריפט באמצעות ה -f אוֹפְּצִיָה. כדי להדגים, נשתמש צמא עם שלנו distros.txt קובץ לבניית דוח. הדוח שלנו יכלול כותרת בחלק העליון, התאריכים ששונו וכל שמות התפוצה שהומרו לאותיות רישיות. כדי לעשות זאת, נצטרך לכתוב סקריפט, אז נפעיל את עורך הטקסט שלנו ונזין את הדברים הבאים:



# סקריפט sed להפקת דוח הפצות לינוקס


1 אני\

\

דוח הפצות לינוקס\


s/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)$/\3-\1-\2/ y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/

# סקריפט sed להפקת דוח הפצות לינוקס


1 אני\

\

דוח הפצות לינוקס\


s/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)$/\3-\1-\2/ y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/


אנחנו נציל את שלנו צמא תסריט כמו distros.sed ותריץ את זה כך:


תמונה

[me@linuxbox ~]$ sed -f distros.sed distros.txt


דוח הפצות לינוקס


SUSE

10.2

2006-12-07

FEDORA

10

2008-11-25

SUSE

11.0

2008-06-19

UBUNTU

8.04

2008-04-24

FEDORA

8

2007-11-08

SUSE

10.3

2007-10-04

UBUNTU

6.10

2006-10-26

FEDORA

7

2007-05-31

UBUNTU

7.10

2007-10-18


UBUNTU

7.04

2007-04-19

SUSE

10.1

2006-05-11

FEDORA

6

2006-10-24

FEDORA

9

2008-05-13

UBUNTU

6.06

2006-06-01

UBUNTU

8.10

2008-10-30

FEDORA

5

2006-03-20


# סקריפט sed להפקת דוח הפצות לינוקס

# סקריפט sed להפקת דוח הפצות לינוקס

כפי שאנו יכולים לראות, התסריט שלנו מייצר את התוצאות הרצויות, אבל איך הוא עושה את זה? בואו נסתכל שוב על התסריט שלנו. אנחנו נשתמש חתול למספר את השורות:



[me@linuxbox ~]$ cat -n distros.sed

[me@linuxbox ~]$ cat -n distros.sed


1

2

3

4

5

6

7

8

1

2

3

4

5

6

7

8


תמונה

1 אני\

\

דוח הפצות לינוקס\


s/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)$/\3-\1-\2/ y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/

1 אני\

\

דוח הפצות לינוקס\


s/\([0-9]\{2\}\)\/\([0-9]\{2\}\)\/\([0-9]\{4\}\)$/\3-\1-\2/ y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/

שורה אחת מהתסריט שלנו היא א הערה. כמו הרבה קבצי תצורה ושפות תכנות במערכות לינוקס, הערות מתחילות ב- # אופי ואחריו מופיע טקסט קריא לאדם. הערות יכולות להיות ממוקמות בכל מקום בסקריפט (אם כי לא בתוך הפקודות עצמן) והן מועילות לכל בני אדם שאולי יצטרכו לזהות ו/או לתחזק את הסקריפט.

שורה 2 היא שורה ריקה. כמו הערות, ניתן להוסיף שורות ריקות כדי לשפר את הקריאות.

רב צמא פקודות תומכות בכתובות קו. אלה משמשים כדי לציין באילו שורות של הקלט יש לפעול. כתובות קו עשויות לבוא לידי ביטוי כמספרי שורה בודדת, טווחי מספרי שורות ומספר השורה המיוחד "$" המציין את שורת הקלט האחרונה.

שורות 3 עד 6 מכילות טקסט שיוכנס בכתובת 1, השורה הראשונה של הקלט. ה i אחרי הפקודה מופיעה הרצף אחורי-החזרת כרכרה כדי לייצר החזרת כרכרה נמלטת, או מה שנקרא תו המשך קו. רצף זה, שניתן להשתמש בו בנסיבות רבות כולל סקריפטים של מעטפת, מאפשר להטמיע החזרת כרכרה בזרם טקסט מבלי לאותת למתורגמן (במקרה זה צמא) שהגיע לסוף השורה. ה i, וכמו כן, ה a (שמצרף טקסט, במקום להכניס אותו) ו c (המחליף טקסט) פקודות, מאפשרות מספר שורות טקסט כל עוד כל שורה, מלבד האחרונה, מסתיימת בתו המשך של שורה. השורה השישית של התסריט שלנו היא למעשה הסוף של הטקסט שהוכנס ומסתיימת בהחזרת כרכרה רגילה במקום בתו של המשך שורה, המסמנת את סוף i פקודה.


תמונה

הערה: תו המשך קו נוצר על ידי קו נטוי אחורי ואחריו מיד

על ידי החזרת כרכרה. אסור להכניס מקומות ביניים.


תמונה

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

תמונה

שורה 8 מבצעת תעתיק של האותיות הקטנות לאותיות גדולות. שימו לב שלא כמו tr, ה y פקודה ב צמא אינו תומך בטווחי תווים (לדוגמה, [א- ז]), וגם לא תומך במחלקות תו POSIX. שוב, מאז ה y הפקודה אינה מקדימה כתובת, היא חלה על כל שורה בזרם הקלט.


אנשים שאוהבים sed אוהבים גם...

sed היא תוכנה בעלת יכולת גבוהה, המסוגלת לבצע משימות עריכה מורכבות למדי לזרמי טקסט. הוא משמש לרוב למשימות פשוטות בשורה אחת ולא סקריפטים ארוכים. משתמשים רבים מעדיפים כלים אחרים למשימות גדולות יותר. הפופולריים שבהם הם awk ו-perl. אלה חורגים מעבר לכלים בלבד כמו התוכניות המכוסות כאן, ומתרחבים לתחום של שפות תכנות שלמות. בפרט, משתמשים ב-perl לעתים קרובות במקום סקריפטים של מעטפת עבור משימות רבות של ניהול מערכות וניהול, כמו גם מדיום פופולרי מאוד לפיתוח אתרים. awk הוא קצת יותר מיוחד. החוזק הספציפי שלו הוא היכולת שלו לתפעל נתונים טבלאיים. זה דומה ל-sed בכך שתוכניות awk בדרך כלל מעבדות קבצי טקסט שורה אחר שורה, תוך שימוש בסכימה דומה למושג sed של כתובת ואחריה פעולה. למרות שגם awk וגם perl הם מחוץ לתחום של ספר זה, הם מיומנויות טובות מאוד עבור משתמש שורת הפקודה של לינוקס ללמוד.


מחשוב ענן מערכת ההפעלה המוביל ב-OnWorks: