الأمر sed هو اختصار لـ stream editor (محرر التدفق). وهو أداة شائعة جدًا على أنظمة Linux/UNIX. Sed ليس محرر نصوص بحد ذاته. ومع ذلك، يمكنه إجراء تعديلات متنوعة لمعالجة نص معين. يتم إرسال النص المدخل كتدفق. Sed بعد ذلك بالإجراءات المطلوبة على التدفق. يقدم هذا الدليل نظرة عامة على الأمر sed وكيفية تشغيله لمعالجة النصوص بنجاح في Linux.
Sed في Linux
قد يأتي تدفق الإدخال لـ sed إما من ملف نصي أو من STDIN (الإدخال القياسي). يمكننا العمل مع مخرجات أمر آخر أو العمل مباشرة مع ملف نصي. تأتي أداة sed مثبتة مسبقًا على جميع توزيعات Linux.
نظرة عامة على استخدام Sed
يتبع الأمر sed البنية التالية:
|
1 |
$ sed <options> <commands> <file> |
لأغراض التوضيح، قمنا بجلب النسخة النصية من GPL license version 3:
|
1 |
$ wget https://www.gnu.org/licenses/gpl-3.0.txt |
سيقوم أمر sed التالي بطباعة محتوى الملف النصي:
|
1 |
$ sed '' gpl-3.0.txt |
هنا، يقوم sed بإجراء العمليات الموضحة داخل علامتي الاقتباس الفرديتين وطباعة المخرجات. وبما أنه لا يوجد خيار محدد، sed سيقوم ببساطة بإجراء عملية فارغة وطباعة محتوى الملف بالكامل.
Sed يقبل أيضًا المخرجات من أمر آخر كتدفق إدخال. في المثال التالي، قم بتمرير محتوى ملف GPL v3 النصي إلى sed لإجراء عملية فارغة:
|
1 |
$ cat gpl-3.0.txt | sed '' |
كيفية طباعة السطور
بدون تحديد أي خيار، سيقوم sed بطباعة جميع محتويات الملف مباشرة. بدلاً من ذلك، يمكننا إرسال أمر الطباعة صراحةً لطباعة النتائج مباشرة إلى المخرج القياسي (STDOUT).
لطباعة المخرجات، استخدم الحرف p:
|
1 |
$ sed 'p' gpl-3.0.txt |
بشكل افتراضي، يقوم sed بطباعة المخرجات على الشاشة. ولأننا استخدمنا أمر الطباعة على وجه التحديد، sed سيطبع كل سطر مرتين. Sed يعمل سطرًا بسطر. حيث يقرأ سطرًا واحدًا، ويجري عمليات محددة، ثم يطبعه، وينتقل إلى السطر التالي.
كما نرى، يتم طباعة كل سطر مرتين. إذا كانت النتيجة مربكة بهذا الشكل، فيمكننا ترتيبها باستخدام الخيار -n. فهو يمنع وظيفة الطباعة التلقائية. وبما أننا نرسل أمر الطباعة، فلا نحتاج إلى تمكين وظيفة طباعة المخرجات الافتراضية:
|
1 |
$ sed -n 'p' gpl-3.0.txt |
فئات محارف التعبير النمطي (Regex)
في التعبيرات النمطية، توجد فئات محارف مختلفة. كل فئة من هذه الفئات لها نطاق محدد. كما تحتوي العديد من الفئات على تعبيرات متعددة. معظم الفئات عبارة عن نطاقات محارف:
-
- [a-z]: محرف صغير (Lowercase)
-
- [A-Z]: محرف كبير (Uppercase)
-
- [0-9]: أرقام
-
- [a-zA-z]: أحرف أبجدية
-
- [a-zA-z0-9]: أي محرف أبجدي رقمي
تحتوي فئات المحارف هذه أيضًا على ترميزات مختلفة:
-
- [:lower:]: محرف صغير
-
- [:upper:]: محرف كبير
-
- [:digit:]: أرقام
-
- [:alpha:]: أحرف أبجدية
-
- [:alphanum:]: محرف أبجدي رقمي
على سبيل المثال، سيقوم الأمر التالي بطباعة جميع السطور التي تحتوي على رقم واحد على الأقل:
|
1 |
$ sed -n 's/[[:digit:]]/&/p' gpl-3.0.txt |
نطاقات العناوين
يمكننا تحديد جزء معين من تدفق النص للعمل عليه. يمكن أن يكون موقعًا ثابتًا لسطر أو نطاقًا من السطور. في المثال الأول، سنقوم بطباعة السطر 5 من ملف GPL v3 النصي:
|
1 |
$ sed -n '5p' gpl-3.0.txt |
بدلاً من سطر واحد، يمكننا أيضًا تحديد نطاق من السطور للعمل عليها. هنا، قمنا بتحديد نطاق العناوين من السطر 5 إلى السطر 9 (إجمالي 5 سطور) الذي سيعمل عليه sed :
|
1 |
$ sed -n '5,9p' gpl-3.0.txt |
هناك أيضًا طرق مختلفة لتحديد عنوان السطر. بدلاً من تحديد أرقام السطور بأنفسنا، يمكننا إعادة ترتيب المثال السابق بحيث يبدأ sed من السطر 5 ويعمل على السطور الخمسة التالية:
|
1 |
$ sed -n '5,+5p' gpl-3.0.txt |
طريقة أخرى لتحديد السطور هي استخدام الفواصل (الخطوات). في المثال التالي، سيبدأ sed من السطر 1 ويعمل على سطر بعد سطر:
|
1 |
$ sed -n '1~2p' gpl-3.0.txt |
حذف النصوص
حتى الآن، عملنا على طباعة أسطر النص المستهدفة. وبدلاً من الطباعة، يمكننا إزالة الأسطر من المخرجات. في المثال التالي، سنقوم بإزالة أسطر متعددة من البداية. هنا، لا نحتاج إلى استخدام الخيار -n لأننا نريد من sed أن يطبع كل شيء آخر لم يتم حذفه. لحذف الأسطر، سنستخدم الخيار d:
|
1 |
$ sed '1~2d' gpl-3.0.txt |
لاحظ أن الملف المصدر لا يزال سليماً كما هو. Sed يقوم فقط بحذف الأسطر أثناء إخراج البيانات. إذا أردت، يمكنك حفظ مخرجات sed في ملف. يمكنك الكتابة فوق الملف الأصلي أو حفظه كملف مختلف:
|
1 |
$ sed '1~2d' gpl-3.0.txt > gpl-3.0.modified.txt |
بدلاً من كتابة المخرجات يدوياً في ملف، يمكن لـ sed إجراء تعديل مباشر في نفس المكان على الملف الأصلي. باختصار، sed سيقوم بتعديل الملف الأصلي وكتابة أي تغييرات تم إجراؤها. ستؤدي هذه الطريقة إلى الكتابة فوق الملف الأصلي، لذا يجب استخدامها بحذر:
|
1 |
$ sed -i '1~2d' gpl-3.0.txt |
نظراً لأن التعديل المباشر في نفس المكان أمر خطير، فإن sed يأتي مجهزاً بميزة النسخ الاحتياطي. عند إجراء تعديلات مباشرة، استخدم -i.bak بدلاً من -i لإنشاء نسخة احتياطية قبل التعديل. Sed سيقوم بإنشاء ملف النسخ الاحتياطي بالامتداد .bak:
|
1 |
$ sed -i.bak '1~2d' gpl-3.0.txt |
استبدال النصوص
يعد هذا، بلا شك، أحد أكثر التطبيقات شيوعاً لأداة sed. حيث تبحث عن نمط نصي وتستبدله بنص محدد. هنا، يتم وصف النمط النصي باستخدام التعبيرات النمطية (أو regex باختصار). لمعرفة المزيد حول استخدام التعبيرات النمطية، اتبع هذا البرنامج التعليمي الذي يوضح كيفية استخدام Grep مع التعبيرات النمطية للبحث عن الأنماط النصية في الملفات.
إليك مثالاً على أبسط عمليات استبدال النصوص باستخدام التعبيرات النمطية:
|
1 |
$ 's/<search_pattern>/<replacement>' |
هنا، s هو أمر الاستبدال. وتعمل الشرطات المائلة كفواصل للنمط والاستبدال. لنضع ذلك قيد التجربة:
|
1 |
$ echo "hello world" | sed 's/hello/HELLO/' |
سيوضح المثال التالي استخدام الشرطة السفلية (_). هنا، ستعمل الشرطات السفلية كفواصل:
|
1 |
$ echo http://example.com/index.html | sed 's_com/index_net/home_' |
هنا، نحن نبحث عن com/index لتغييره إلى net/home. لاحظ مواضع الشرطات السفلية لأنها مهمة للغاية. على سبيل المثال، إذا نسيت الشرطة السفلية الأخيرة، فإن sed سيظهر خطأً:
|
1 |
$ echo "http://www.example.com/index.html" | sed 's_com/index_net/home' |
نحتاج إلى ملف تجريبي للتدرب على بعض عمليات الاستبدال. هنا، لدي نسخة مقتصة من ملف نص GPL v3:
|
1 |
$ cat gpl-3.0.cropped.txt |
فلنقم ببعض عمليات استبدال النصوص الأساسية:
|
1 |
$ cat gpl-3.0.cropped.txt | sed 's/GNU/GNU is Not Unix/' |
ألقِ نظرة على المثال التالي. نريد تغيير جميع تكرارات the إلى THE :
|
1 |
$ echo "the the quick brown fox jumps over the lazy dog" | sed 's/the/THE/' |
هل لاحظت شيئاً؟ Sed لم يغير جميع تكرارات the. في الواقع، قام بتغيير التكرار الأول فقط. ما الذي يحدث؟ هذا هو السلوك الافتراضي للخيار s. فهو يطابق التكرار الأول فقط في سطر معين ثم ينتقل إلى السطر التالي. لضمان أن sed يبحث في السطر بأكمله عن نمط البحث، نحتاج إلى استخدام علامة اختيارية g. لنقم بتصحيح الأمر:
|
1 |
$ echo "the the quick brown fox jumps over the lazy dog" | sed 's/the/THE/g' |
الآن يعمل الأمر كما هو مطلوب. هناك طريقة أخرى مثيرة للاهتمام لاستخدام الأمر وهي تحديد عدد التكرارات المراد تغييرها. في المثال السابق، كان هناك 3 تكرارات لـ the، أليس كذلك؟ ماذا لو حددنا تغيير التكرار الـ 3rd فقط؟ سيحدث التغيير عند العلامة الاختيارية:
|
1 |
$ echo "الثعلب الثعلب البني السريع يقفز فوق الكلب الكسول" | sed 's/the/THE/3' |
إذا كنت تعمل على ملف نصي كبير، فقد يكون من المفيد أن sed يطبع فقط تلك السطور التي حدثت فيها الاستبدالات. ولتحقيق ذلك، نحتاج إلى إضافة علامة إضافية أخرى p:
|
1 |
$ sed -n 's/GNU/GNU is Not Unix/gp' gpl-3.0.txt |
حساسية حالة الأحرف
بشكل افتراضي، فإن جميع عمليات sed تكون حساسة لحالة الأحرف. سيوضح الأمر التالي السلوك الافتراضي لحساسية حالة الأحرف:
|
1 |
$ echo "HELLO WORLD" | sed 's/hello/hElLo/' |
بسبب عدم تطابق حالة الأحرف، لا يوجد أي تغيير. في مثل هذه الحالة، يمكننا إخبار sed بتعطيل حساسية حالة الأحرف. للقيام بذلك، أضف العلامة الاختيارية i:
|
1 |
$ echo "HELLO WORLD" | sed 's/hello/hElLo/i' |
كيفية استبدال النصوص والإشارة إليها
تكمن قوة sed غالباً في قدرته على استخدام التعبيرات النمطية. مع أنماط التعبيرات النمطية الأكثر تقدماً وتعقيداً، يمكننا تحقيق الكثير. على سبيل المثال، يمكننا استبدال النص من بداية الملف إلى موقع معين. ألقِ نظرة على التعبير التالي:
|
1 |
$ sed 's/^.*GNU/GNU_replaced/' gpl-3.0.txt |
هنا، رمز الإقحام (^) يشير إلى بداية السطر. ويُشار إلى عامل مطابقة أي حرف باستخدام النقطة (.). والنجمة (*) هي تعبير حرف البدل (wildcard)، حيث تطابق من بداية السطر وحتى GNU.
حيلة أخرى مثيرة للاهتمام هي استخدام الرمز &. يمكننا استخدامه لتسليط الضوء على المناطق التي يجد فيها sed نمط البحث:
|
1 |
$ sed 's/^.*GNU/(&)/' gpl-3.0.txt |
أفكار ختامية
في هذا البرنامج التعليمي، استكشفنا أساسيات الأمر sed . وتعلمنا كيفية طباعة سطور معينة، والبحث في النصوص، وحذف النصوص واستبدالها، والكتابة فوق النصوص، واستخدام التعبيرات النمطية. إن أمر sed المصاغ بشكل صحيح يمكنه تحويل مستند نصي بشكل كبير. يمكنك الآن معالجة النصوص بنجاح في Linux بمساعدة sed.
حوسبة سعيدة!









التعليقات
لا توجد تعليقات بعد. كن أول من يعلق.