OnWorks Linux و Windows Online WorkStations

الشعار

استضافة مجانية على الإنترنت لمحطات العمل

<السابق | المحتويات | التالي>

عطش

الاسم عطش هو اختصار ل محرر تيار. يقوم بتحرير النص على دفق من النص ، مثل مجموعة من الملفات المحددة أو الإدخال القياسي. عطش هو برنامج قوي ومعقد إلى حد ما (توجد كتب كاملة عنه) ، لذلك لن نغطيه بالكامل هنا.

بشكل عام ، الطريق عطش يعمل هو أنه يتم إعطاؤه إما أمر تحرير واحد (في سطر الأوامر) أو اسم ملف نصي يحتوي على أوامر متعددة ، ثم يقوم بتنفيذ هذه الأوامر على كل سطر في دفق النص. هنا مثال بسيط للغاية عطش في العمل:


[me @ linuxbox ~] $ صدى "الجبهة" | sed 's / front / back /'

الى الخلف

[me @ linuxbox ~] $ صدى "الجبهة" | sed 's / front / back /'

الى الخلف


في هذا المثال ، ننتج دفقًا نصيًا من كلمة واحدة باستخدام echo ونقوم بتوجيهه عطش. عطش، بدوره ، ينفذ التعليمات ق / أمام / خلف / على النص في الدفق وينتج الإخراج "رجوع" كنتيجة لذلك. يمكننا أيضًا التعرف على هذا الأمر على أنه تجميع لأمر "الاستبدال" (بحث واستبدال) vi.

أوامر في عطش تبدأ بحرف واحد. في المثال أعلاه ، يتم تمثيل أمر الاستبدال بالحرف s ويتبعها سلاسل البحث والاستبدال ، مفصولة بحرف الشرطة المائلة كمحدد. اختيار الحرف المحدد هو أمر اختياري. حسب الاصطلاح ، غالبًا ما يتم استخدام حرف الخط المائل ، ولكن عطش سيقبل أي حرف يتبع الأمر مباشرة كمحدد. يمكننا أداء نفس الأمر بهذه الطريقة:



[me @ linuxbox ~] $ صدى "الجبهة" | سيد 's_front_back_'

الى الخلف

[me @ linuxbox ~] $ صدى "الجبهة" | سيد 's_front_back_'

الى الخلف


باستخدام حرف تسطير أسفل السطر مباشرة بعد الأمر ، يصبح المُحدِّد. يمكن استخدام القدرة على تعيين المحدد لجعل الأوامر أكثر قابلية للقراءة ، كما سنرى.

معظم الأوامر في عطش قد يسبقه العنوان، والذي يحدد أي سطر (خطوط) من تدفق الإدخال سيتم تحريره. إذا تم حذف العنوان ، فسيكون أمر التحرير car-


انتزاع على كل سطر في دفق الإدخال. أبسط شكل من أشكال العنوان هو رقم السطر. يمكننا إضافة واحد إلى مثالنا:



[me @ linuxbox ~] $ صدى "الجبهة" | sed '1s / أمامي / خلفي /'

الى الخلف

[me @ linuxbox ~] $ صدى "الجبهة" | sed '1s / أمامي / خلفي /'

الى الخلف


إضافة العنوان 1 لأمرنا يؤدي إلى إجراء الاستبدال على السطر الأول من دفق الإدخال أحادي السطر. إذا حددنا رقمًا آخر:



[me @ linuxbox ~] $ صدى "الجبهة" | sed '2s / أمامي / خلفي /'

جبهة

[me @ linuxbox ~] $ صدى "الجبهة" | sed '2s / أمامي / خلفي /'

جبهة


نرى أن التحرير لم يتم تنفيذه ، نظرًا لأن تدفق الإدخال لا يحتوي على سطر 2. يمكن التعبير عن العناوين بعدة طرق. فيما يلي الأكثر شيوعًا:

جدول 20-7: تدوين العنوان sed


وصف العنوان

وصف العنوان

n رقم الخط حيث n هو عدد صحيح موجب.


صورة

$ السطر الأخير.


صورة

/REGEXP/ الأسطر التي تطابق التعبير العادي الأساسي POSIX. لاحظ أن التعبير العادي محدد بشرطة مائلة. اختياريًا ، يمكن تحديد التعبير النمطي بحرف بديل ، عن طريق تحديد التعبير باستخدام \com.cregexpc، حيث c هي الشخصية البديلة.


صورة

العنوان 1,العنوان 2 مجموعة من الخطوط من العنوان 1 إلى العنوان 2، شامل. قد تكون العناوين أيًا من نماذج العناوين الفردية أعلاه.


صورة

أول~. تطابق السطر الذي يمثله الرقم أول، ثم كل سطر لاحق عند . فترات. على سبيل المثال 1 ~ 2 يشير إلى كل سطر مرقّم فردي ، 5 ~ 5 يشير إلى السطر الخامس وكل سطر خامس بعد ذلك.


صورة

العنوان 1، + ن مباراة العنوان 1 وما يلي n خطوط.


صورة

ADDR! تطابق كافة الأسطر باستثناء ADDR، والتي قد تكون أيًا من الأشكال المذكورة أعلاه.


صورة


سنعرض أنواعًا مختلفة من العناوين باستخدام امتداد توزيعات.txt ملف من وقت سابق


في هذا الفصل. أولاً ، مجموعة من أرقام الأسطر:


صورة

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

سوس 10.2 12/07/2006

فيدورا 10 11/25/2008

سوس 11.0 06/19/2008

نظام التشغيل Ubuntu 8.04 04/24/2008

فيدورا 8 11/08/2007


في هذا المثال ، نطبع نطاقًا من الأسطر ، بدءًا من السطر 1 ويستمر حتى السطر 5. للقيام بذلك ، نستخدم الامتداد p الأمر الذي يؤدي ببساطة إلى طباعة سطر مطابق. لكي يكون هذا فعالًا ، يجب علينا تضمين الخيار -n (خيار عدم الطباعة التلقائية) للتسبب عطش عدم طباعة كل سطر بشكل افتراضي.

بعد ذلك ، سنحاول التعبير النمطي:



[me @ linuxbox ~] $

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

سوس 10.2

12/07/2006

سوس 11.0

06/19/2008

سوس 10.3

10/04/2007

سوس 10.1

05/11/2006


بتضمين التعبير العادي بشرطة مائلة / سوس /، فنحن قادرون على عزل الأسطر التي تحتوي عليها بنفس الطريقة مثل البقرى.

أخيرًا ، سنحاول النفي عن طريق إضافة علامة تعجب (!) إلى العنوان:


[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: أوامر التحرير الأساسية


وصف الأمر

وصف الأمر

= إخراج رقم السطر الحالي.


صورة

أ إلحاق نص بعد السطر الحالي.


صورة

د يحذف السطر الحالي.


صورة

i أدخل نصًا أمام السطر الحالي.


صورة

p اطبع السطر الحالي. بشكل افتراضي ، تطبع sed كل سطر وتحرر فقط الأسطر التي تطابق عنوانًا محددًا داخل الملف. يمكن تجاوز السلوك الافتراضي بتحديد الخيار -n.


صورة

q خروج عطش بدون معالجة أي خطوط أخرى. إذا كان

لم يتم تحديد الخيار -n ، إخراج السطر الحالي.


صورة

Q خروج عطش بدون معالجة أي خطوط أخرى.


صورة

s/REGEXP/إستبدال/ استبدل محتويات إستبدال أينما

REGEXP وجد. إستبدال قد تشمل الطابع الخاص &، وهو ما يعادل النص المطابق لـ REGEXP. بالإضافة الى، إستبدال قد تشمل التسلسلات \1 من خلال \9، وهي محتويات العبارات الفرعية المقابلة بتنسيق REGEXP. لمزيد من المعلومات حول هذا ، راجع مناقشة الرجوع المراجع أدناه. بعد الشرطة المائلة اللاحقة إستبدال، يمكن تحديد علامة اختيارية لتعديل s سلوك الأمر.


صورة

y/set1/set2 قم بإجراء التحويل الصوتي عن طريق تحويل الأحرف من set1 إلى الأحرف المقابلة في set2. لاحظ أن على عكس tr, عطش يتطلب أن تكون كلتا المجموعتين من نفس الطول.


صورة


s الأمر إلى حد بعيد هو أمر التحرير الأكثر استخدامًا. سوف نظهر فقط بعضًا من قوتها من خلال إجراء تعديل على توزيعات.txt ملف. لقد ناقشنا قبل كيف يتم إدخال حقل التاريخ توزيعات.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

سوز 10.2 2006-12-07

فيدورا 10 2008-11-25

سوز 11.0 2008-06-19

نظام التشغيل Ubuntu 8.04 2008-04-24

فيدورا 8 2007-11-08

سوز 10.3 2007-10-04

نظام التشغيل Ubuntu 6.10 2006-10-26

فيدورا 7 2007-05-31

نظام التشغيل Ubuntu 7.10 2007-10-18

نظام التشغيل Ubuntu 7.04 2007-04-19

سوز 10.1 2006-05-11

فيدورا 6 2006-10-24

فيدورا 9 2008-05-13

نظام التشغيل Ubuntu 6.06 2006-06-01

نظام التشغيل Ubuntu 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 ~] $ صدى "aaabbbccc" | sed 's / b / B /'

aaaBbbccc

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

aaaBbbccc


نرى أن الاستبدال قد تم إجراؤه ، ولكن فقط للمثيل الأول من الحرف "b" ، بينما لم تتغير المثيلات المتبقية. عن طريق إضافة g علم ، نحن قادرون على تغيير جميع الحالات:



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

aaaBBccc

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

aaaBBccc


حتى الآن ، قدمنا ​​فقط عطش أوامر مفردة عبر سطر الأوامر. من الممكن أيضًا إنشاء أوامر أكثر تعقيدًا في ملف نصي باستخدام الامتداد -f اختيار. للتوضيح ، سوف نستخدم عطش معنا توزيعات.txt ملف لإنشاء تقرير. سيحتوي تقريرنا على عنوان في الأعلى ، وتواريخنا المعدلة ، وجميع أسماء التوزيع المحولة إلى أحرف كبيرة. للقيام بذلك ، سنحتاج إلى كتابة برنامج نصي ، لذلك سنقوم بتشغيل محرر النصوص الخاص بنا وإدخال ما يلي:



# sed script لإنتاج تقرير توزيعات Linux


1 أنا \

\

تقرير توزيعات Linux \


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

# sed script لإنتاج تقرير توزيعات Linux


1 أنا \

\

تقرير توزيعات Linux \


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


سننقذ عطش النصي باسم توزيعات وتشغيله على هذا النحو:


صورة

[me @ linuxbox ~] $ sed -f توزيعات.sed توزيعات.txt


تقرير توزيعات Linux


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


# sed script لإنتاج تقرير توزيعات Linux

# sed script لإنتاج تقرير توزيعات Linux

كما نرى ، ينتج النص الخاص بنا النتائج المرجوة ، ولكن كيف يفعل ذلك؟ دعنا نلقي نظرة أخرى على السيناريو الخاص بنا. سنستخدم قط لترقيم الأسطر:



[me @ linuxbox ~] $ القط توزيعات

[me @ linuxbox ~] $ القط توزيعات


1

2

3

4

5

6

7

8

1

2

3

4

5

6

7

8


صورة

1 أنا \

\

تقرير توزيعات Linux \


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

1 أنا \

\

تقرير توزيعات Linux \


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

السطر الأول من نصنا هو ملف التعليق. مثل العديد من ملفات التكوين ولغات البرمجة على أنظمة Linux ، تبدأ التعليقات بامتداد # حرف ويتبعها نص يمكن للبشر قراءته. يمكن وضع التعليقات في أي مكان في البرنامج النصي (ولكن ليس ضمن الأوامر نفسها) وهي مفيدة لأي شخص قد يحتاج إلى تحديد و / أو الحفاظ على النص.

السطر 2 هو سطر فارغ. مثل التعليقات ، يمكن إضافة أسطر فارغة لتحسين إمكانية القراءة.

كثير عطش أوامر دعم عناوين الخط. يتم استخدام هذه لتحديد سطور الإدخال التي سيتم التعامل معها. يمكن التعبير عن عناوين الأسطر كأرقام سطر فردي ونطاقات أرقام سطر ورقم سطر خاص "$" الذي يشير إلى آخر سطر من الإدخال.

تحتوي السطور من 3 إلى 6 على نص يتم إدراجه في العنوان 1 ، السطر الأول من الإدخال. ال i يتبع الأمر تسلسل مائل عكسي - حرف إرجاع لإنتاج حرف إرجاع إسماعي ، أو ما يسمى حرف استمرار السطر. يسمح هذا التسلسل ، الذي يمكن استخدامه في العديد من الظروف بما في ذلك البرامج النصية للقذيفة ، بتضمين حرف العودة في تدفق النص دون الإشارة إلى المترجم (في هذه الحالة عطش) أنه تم الوصول إلى نهاية السطر. ال i، وبالمثل ، فإن a (الذي يلحق النص ، بدلاً من إدراجه) و c (التي تحل محل النص) ، تسمح بسطر متعددة من النص طالما أن كل سطر ، باستثناء الأخير ، ينتهي بحرف متابعة سطر. السطر السادس من البرنامج النصي الخاص بنا هو في الواقع نهاية النص المُدرج وينتهي بحرف انعكاس عادي بدلاً من حرف استمرار السطر ، مما يشير إلى نهاية i أمر.


صورة

ملاحظة: يتم تشكيل حرف متابعة السطر بشرطة مائلة للخلف متبوعة فورا

بحرف رجوع. لا يسمح بمساحات وسيطة.


صورة

السطر 7 هو أمر البحث والاستبدال الخاص بنا. نظرًا لأنه لا يسبقه عنوان ، فإن كل سطر في دفق الإدخال يخضع لعمله.

صورة

يقوم السطر 8 بالترجمة الصوتية للأحرف الصغيرة إلى أحرف كبيرة. لاحظ أن على عكس trأطلقت حملة y الأمر في عطش لا يدعم نطاقات الأحرف (على سبيل المثال ، [أ- ي]) ، ولا يدعم فئات أحرف POSIX. مرة أخرى ، منذ y الأمر لا يسبقه عنوان ، فهو ينطبق على كل سطر في تدفق الإدخال.


الناس الذين يحبون سيد أيضا مثل ...

Sed هو برنامج قادر للغاية ، قادر على أداء مهام تحرير معقدة إلى حد ما لتدفقات النص. غالبًا ما يتم استخدامه لمهام بسيطة من سطر واحد بدلاً من البرامج النصية الطويلة. يفضل العديد من المستخدمين أدوات أخرى للمهام الأكبر. الأكثر شعبية من هؤلاء هي awk و perl. هذه تتجاوز مجرد أدوات مثل البرامج التي يتم تناولها هنا ، وتمتد إلى عالم لغات البرمجة الكاملة. غالبًا ما يتم استخدام Perl ، على وجه الخصوص ، بدلاً من البرامج النصية shell scripts في العديد من مهام إدارة النظام والإدارة ، فضلاً عن كونها وسيلة شائعة جدًا لتطوير الويب. awk أكثر تخصصًا. قوتها الخاصة هي قدرتها على معالجة البيانات الجدولية. إنه يشبه sed في أن برامج awk تعالج عادةً الملفات النصية سطرًا بسطر ، باستخدام مخطط مشابه لمفهوم sed لعنوان متبوعًا بإجراء. في حين أن كلا من awk و perl خارج نطاق هذا الكتاب ، إلا أنهما مهارات جيدة جدًا لمستخدم سطر أوامر Linux ليتعلمها.


أفضل الحوسبة السحابية لنظام التشغيل في OnWorks: