اذهب إلى المحتوى

ابتكِر الأمر 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.

اقرأ أيضًا

 


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...