ابتكِر الأمر sed
في البداية للإصدار السابع من أنظمة تشغيل يونيكس الأساسية لشركة AT&T، وأصبح جزءًا من كل أنظمة تشغيل يونيكس أو لينكس منذ ذلك الحين. يعد برنامج sed
محررًا تدفقيًا stream editor، لكن على عكس محررات النصوص فهو لا يفتح مخزِّنًا مؤقتًا مرئيًا تتحمل ضمنه بيانات الملف لمعالجتها، بل ينفذ على ملف سطرًا تلو الآخر إما حسب الأمر الذي تدخله إلى الطرفية أو حسب سلسلة الأوامر الواردة ضمن نص برمجي script.
تثبيت محرر النصوص Sed
إذا كان نظام التشغيل لديك لينوكس أو بي إس دي BSD أو ماك أو إس macOS سيكون برنامج sed من إصدار GNU أو BSD مثبتًا أصلًا. هذان الإصداران إعادة تنفيذ فريدة للأمر sed
الأصلي، وهما متشابهان بالمجمل لكن توجد بينهما بعض الفروق الطفيفة. يعد إصدار GNU للأمر sed
بشكل عام أكثر إصدار متاح غني بالخصائص، ويستخدم على نطاق واسع على أي من المنصات التي ذكرناها.
إذا لم تجد إصدار GNU للأمر sed
(الذي يدعى غالبًا gsed
على أي نظام تشغيل غير لينوكس)، حمّل شيفرته المصدرية من موقع GNU. من محاسن تثبيت إصدار GNU للأمر sed
إمكانية الاستفادة من خصائصه الإضافية، لكن يمكنك تقييده ليتوافق مع معايير POSIX فقط إذا احتجت تحويله.
أما على أنظمة تشغيل ويندوز ثبت إصدار GNU للأمر sed
من خلال مدير الحزم شوكولاتي Chocolatey.
آلية عمل برنامج sed
يعمل برنامج sed
على كل سطر على حدى. ينشئ حيزًا نمطيًا pattern space لأنه لا يعرض البيانات عرضًا مرئيًا، يتضمن الحيز في الذاكرة السطر الحالي من مجرى الدخل input stream (مع أي محرف متتابع محذوف من السطر الجديد). تنفَّذ أوامرك التي أدخلتها لبرنامج sed
عندما يمتلئ الحيز النمطي. تكون أحيانًا الأوامر التي تدخلها شرطيةً وأحيانًا تكون حتميةً، لذا تعتمد نتائج هذه الأوامر على طريقة استخدامك لبرنامج sed
.
عندما تنتهي الأوامر المُدخَلة يطبع sed
محتويات الحيز النمطي على مجرى الخرج output stream. إن stdout هو مجرى الخرج الافتراضي أو القياسي، لكنك تستطيع إعادة توجيه الخرج إلى ملف آخر أو حتى إعادته إلى نفس الملف باستخدام الخيار in-place=.bak--
.
ثم تبدأ الدورة مجددًا في سطر الدخل التالي.
تكون صيغة الأمر sed
كالتالي:
$ sed --options [optional SCRIPT] [INPUT FILE or STREAM]
البحث عما تريد تعديله
لا تضطر إلى بذل جهد في تحديد مكان ما تريد تعديله في ملف نصي عند استخدامك المحرر المرئي، إذ تجري مسحًا لكامل النص بعينيك، ثم تجد الكلمة التي تريد تغييرها أو الموضع الذي تريد إدخال نص فيه أو حذف نص منه، ثم تبدأ بالكتابة. لكن sed
لا يوجد فيها نمط تفاعلي، لذا عليك أن تملي عليه الشروط التي يجب أن تتحقق حتى ينفذ أوامر معينة.
لنفترض في الأمثلة التالية أنه لدينا ملفًا باسم example.txt
يحتوي النص التالي:
hello world This is line three. Here is the final line.
رقم السطر
إن تحديد رقم للسطر يعلِم الأمر sed
أن لا ينفذ الأمر إلا على ذلك السطر ضمن الملف.
فمثلًا يختار الأمر في المثال التالي السطر الأول في الملف ويطبعه. نلاحظ أن السطر الأول طبِع مرتين، لأن الإجراء الافتراضي في الأمر sed
بعد المعالجة هو أن يطبع السطر على المجرى stdout أيضًا:
$ sed '1p' example.txt hello hello world This is line three. Here is the final line.
يمكنك تحديد أرقام الأسطر على عدة خطوات. مثلًا تشير 1~2
أنه سيحدد كل سطرين ("حدد كل سطر ثانٍ بدءًا من السطر الأول"). ويعني الأمر 1~3
أنه سيحدد كل سطر ثالث بعد السطر الأول.
$ sed '1p' example.txt hello hello world This is line three. Here is the final line. Here is the final line.
موضع السطر
لن تستطيع أن تنفذ أي أمر إلا على آخر سطر في الملف عندما تستخدم المحدد selector التالي $
:
$ sed '$p' example.txt hello world This is line three. Here is the final line. Here is the final line.
يمكنك في إصدار GNU للأمر sed
تحديد أكثر من سطر (مثلًا يطبع الأمر 'sed '1,$p
أول وآخر سطر في الملف).
النفي
يمكنك عكس أي تحديد حددته بواسطة الرقم أو الموضع بإضافة محرف إشارة التعجب (!). يحدد الأمر التالي جميع الأسطر باستثناء الأول:
$ sed '1!p' example.txt hello world world This is line three. This is line three. Here is the final line. Here is the final line.
تطابق النمط
يمكنك تشبيه تطابق النمط pattern match بخيار find الموجود في المتصفح أو معالج النصوص، فأنت تزوده بالكلمة (النمط) وهو يحدد النتائج. صيغة تطابق النمط هي /pattern/
.
$ sed '/hello/p' example.txt hello hello world This is line three. Here is the final line. $ sed '/line/p' example.txt hello world This is line three. This is line three. Here is the final line. Here is the final line.
التعديل باستخدام الأمر Sed
بعدما وجدت ما تريد تعديله، تستطيع تطبيق أي إجراء تريده عليه. تجري التعديلات في الأمر sed
عن طريق الأوامر. تختلف الأوامر في sed
عن الأمر sed
نفسه. لتبسيط الفكرة تخيل أنهم "إجراءات" أو "أفعال" أو "توجيهات".
تكون الأوامر في sed
عبارة عن حرف واحد، مثل الحرف p
في أمر الطباعة print الذي استخدمناه في الأمثلة السابقة. قد يصعب تذكرها في البداية، لكن حالها كحال أي شيء تحترفه بممارسته.
الأمر p للطباعة
يطبع الأمر p
أي شيء يشغل الحيز النمطي ومررنا على كيفية استخدامه في الأمثلة السابقة.
الأمر d للحذف
يحذف الأمر d
محتوى الحيز النمطي.
$ sed '$d' example.txt hello world This is line three. $ sed '1d' example.txt world This is line three. Here is the final line.
الأمر s للبحث والاستبدال
يبحث الأمر s
عن نمط ويستبدله بآخر. وربما هذا أشيع استخدام للأمر sed
، ويكون عادةً أول أمر يتعلمه المستخدم في الأمر sed
(وأحيانًا الأمر الوحيد). من شبه المؤكد أنه أنفع أمر في تحرير النصوص.
$ sed 's/world/Hsoub.com/' hello Hsoub.com This is line three. Here is the final line.
كما توجد خصائص خاصة تستطيع استخدامها في نصك البديل أيضًا. فمثلًا يحول L\
جميع أحرف النص البديل إلى أحرف صغيرة، أما l\
يؤدي نفس المهمة لكن للمحرف التالي فقط. وتوجد خصائص أخرى تجدها في توثيق sed
(يمكنك الاطلاع عليه باستخدام الأمر info sed
).
يشير المحرف الخاص &
في العبارة البديلة إلى النمط المطابِق، كما يشير U\
إلى عرض الخرج فورًا بدل من تخزينه في الذاكرة المؤقتة Buffer:
$ sed 's/is/\U&/' example.txt hello world ThIS is line three. Here IS the final line.
كما تستطيع تمرير رايات flags خاصة لتحدد كيف ستعالج s
النص الذي تجده. تجعل راية g
(ربما اختصارًا لكلمة global أو عام) الأمر s
يستبدل جميع حالات التطابق التي يجدها في السطر، وليس أول حالة تطابق فقط:
$ sed 's/is/\U&/g' example.txt hello world ThIS IS line three. Here IS the final line.
إحدى الرايات المهمة الأخرى تتضمن رقمًا يشير إلى أية حالة تَطابق نمط سينفذ الأمر عليها:
$ sed 's/is/\U&/2' example.txt hello world This IS line three. Here is the final line.
عندما تضيف الراية w
متبوعةً باسم ملف، يكتب الأمر السطر المطابِق في ذلك الملف في حالة حدوث تغيير فقط:
$ sed 's/is/\U&/w sed.log' example.txt hello world ThIS is line three. Here IS the final line.
$ cat sed.log ThIS is line three. Here IS the final line.
تستطيع دمج الرايات مع بعضها:
$ sed 's/is/\U&/2w sed.log' example.txt hello world This IS line three. Here is the final line.
$ cat sed.log This IS line three.
النصوص البرمجية
توجد العديد من المواقع على الإنترنت التي تزودك بمدخلات جاهزة للأمر sed
عبارة عن سطر واحد. فهي توفر لك مهام محددة في أوامر sed
لحل المشاكل الشائعة. لكن اعتمادك على نفسك في تعلم الأمر sed
يتيح لك كتابة مدخلاتك بنفسك، التي تفصّلها حسب احتياجاتك.
يمكن كتابة النصوص البرمجية أو السكربتات scripts للأمر sed
كسطور في الطرفية، أو يمكن حفظها في ملف وتنفيذها ضمن الأمر sed
نفسه. أنا أفضل كتابة جميع النصوص البرمجية الصغيرة كأمر واحد لأنني نادرًا ما أجد نفسي أعيد استخدام أوامر sed
في الحياة اليومية. فعندما أكتب نصًا برمجيًا للأمر sed
، يكون مخصصًا لملف واحد. مثلًا بعدما كتبت المسودة الأولية من هذا المقال بالذات، استعنت بالأمر sed
لأوحِّد حالة أحرف كلمة "sed"، وربما لن أضطر لتنفيذ هذه المهمة مجددًا أبدًا. يمكنك الاطلاع على توثيق باش Bash في موسوعة حسوب للتعرف أكثر حول عملية كتابة السكربتات.
يمكنك إرسال سلسلة أوامر منفصلة إلى الأمر sed
والفصل بينها بفاصلة منقوطة (;).
$ sed '3t ; s/line/\U&/' example.txt hello world This is LINE three. This is the final line.
تحديد مجال التعديل باستخدام الأقواس
كما يمكنك تحديد النتائج التي سيطبق عليها الأمر بإضافة الأقواس ({}). فعندما تضيف الأقواس إلى الأمر sed
، لا تطبق الأوامر إلا على ما تحدده فقط. مثلًا ترد الكلمة "line" في سطرين ضمن النص في مثالنا السابق، يمكنك إلزام الأمر sed
بأن ينفَّذ على السطر الأخير فقط من خلال الإعلان عن شرط التطابق المطلوب (وهو $
للإشارة إلى السطر الأخير) ثم وضع الأمر s
الذي تريد تنفيذه ضمن قوسين مباشرةً بعده:
$ sed '$ {s/line/\U&/}' example.txt hello world This is line three. This is the final LINE.
تعلم الأمر sed
يحمل الأمر sed
في طياته العديد من الفوائد الأخرى غير التي ذكرتها في المقال. فأنا لم أتطرق حتى إلى التفرُّع (b
) والاختبارات (t
) وحجز الحيز (H
) وخصائص عديدة غيرها. على غرار الأمرed
، ربما لن يكون sed
هو محرر النصوص الذي ستستخدمه لإنشاء المستندات، أو حتى في جميع المهام المكتوبة على شكل نصوص برمجية التي ستحتاج إلى إنشائها، لكنه خيار قوي في يديك كمستخدم يعمل وفق معايير POSIX. فإن تعلمك هيكلية الأوامر في sed
وطريقة كتابة نصوص برمجية قصيرة سيحقق لك إمكانية إجراء تعديلات سريعة في نصوص ضخمة. اطلع على صفحات info
للأمر sed
من إصدار GNU، أو صفحات الدليل man للأمر sed
من إصدار BSD، لتتعمق فيما سيفيدك الأمر sed
خلال عملك.
ترجمة -وبتصرف- للمقال Learn to use the Sed text editor لصاحبه Seth Kenlon.
اقرأ أيضًا
- دليل استخدام الأمر grep في لينكس
- دليل الربط الشبكي في ترميز CIDR وضبطه في لينكس
- مقدمة في التوجيه الشبكي في نظام التشغيل لينكس
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.